Oracle-11g

將函式列的輸出值用於 SQL*Loader 中的另一列

  • August 31, 2016

我在 StackOveflow 上問過同樣的問題。不知道這個網站是否與那個連結,因此這個問題是否會被這裡的專業人士看到,所以我在這裡添加它。如果這樣做不合適,請告訴我。

==============================

我正在嘗試定義一個 SQL*Loader 控製文件,其中 col1 是通過使用一個使用者函式來確定的,該函式接受幾個參數和輸入文件中的值。這部分工作正常。

我想將上述函式返回的值用作另一個使用者定義函式的參數,但這不起作用。發送到第二個函式的值不是第一列的計算值。

這可能嗎?有人可以給我一個樣品嗎?

這是我的控製文件

( col1  BOUNDFILLER         POSITION(1:8),
 col2  INTEGER EXTERNAL    "schema_own.get_col2_val(:col1, :col6)",
 col3              POSITION(29:33) CHAR,
 col4              "sysdate",
 col5              constant " ",
 col6              POSITION(9:11)  CHAR,
 col7              "sysdate",
 col8              POSITION(12:18) CHAR,
 col9              POSITION(19:28) CHAR,
 col10             POSITION(29:33) CHAR,
 col11             POSITION(52:63) CHAR,
 col12             "(col2)", --constant    "TEST",
 col13             "schema_own.get_col13_value(:col1, :col2)",
 LAST_UPDATE_TS            "sysdate",
 LAST_UPDATE_USER_I        constant "SQLLDR"
)

似乎正在發生的事情是 get_col13_value 中的第二個參數似乎包含 col6 的第一個字元,而不是 col2 在呼叫 get_col2_val 時應該具有的數字。

我用 (col2) 和 (:col2) 嘗試了 col12 - 結果相同。

我錯過了什麼嗎?

有人還可以幫助我了解何時在 sql loader 中使用 col2 與 :col2 嗎?

不要認為你可以使用函式的結果。載入程序的文件可以在實用程序手冊中找到。 將 SQL 運算符應用於欄位

SQL 字元串的執行不被視為欄位設置的一部分。相反,當執行 SQL 字元串時,它使用任何欄位設置的結果 (…)

欄位設置是指將欄位名稱分配給載入的文件記錄的目前數據的子字元串。指定數據欄位的位置中描述了這是如何工作的:如果您有一個POSITION(x:y)名為列的規範,col則從位置 x 到位置 y 的子字元串是欄位值,col它可以像:col在 sql 字元串中一樣被引用。如果在您的欄位、、 、、、和的規範中沒有POSITION找到規範,則 POSITION 會根據前一個欄位和列的數據類型以某種方式定義。所以因為-Field (由col2``col4``col5``col7``col12``col13``LAST_UPDATE_T``LAST_UPDATE_USER_I``col2``:col2在 sql 字元串中)沒有明確的欄位規範,它是INTEGER EXTERNAL 類型(預設長度為 1)的欄位,其後跟col1. 所以它實際上是POSITION(9:9),因此是第一個字元:col6

如果要根據其他列值設置表的列值,可以在表上使用觸發器。

未經測試,但我相信你必須做這樣的事情:

 col13 "schema_own.get_col13_value(:col1, schema_own.get_col2_val(:col1, :col6))",

引用自:https://dba.stackexchange.com/questions/90122