我有來自在 oracle 應用程式中創建的主機程式的 .prog 檔案。我正在使用主機程式從 oracle 應用程式發送一個引數,我可以在 .prog 檔案中訪問它,例如
echo "5 Concurrent Program Parameter 1 : " ${5}
我需要在控制檔案 (.ctl) 中使用這個引數 ($5),我將在其中插入一些列和這個引數到一個新表中。例如
LOAD DATA
INSERT INTO TABLE TABLE_NAME
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
COL1,
COL2,
DATA_FROM_PROG (5) => ** here i need to insert that data from the .prog file**
)
我認為它必須以某種方式包含在此命令中,因此它會動態創建此控制檔案或另一個控制檔案,但我無法弄清楚如何發送該引數并使其作業。我熟悉這行,我過去用于解決更簡單的問題
例如sqlldr userid=user/pass data=$5 control=control.ctl
謝謝。
uj5u.com熱心網友回復:
我不知道,因為我對 Oracle 應用程式一無所知。也不是“.prog”檔案。
解決方法 - 從我的角度來看 - 將是
- 僅加載已知資料(來自源檔案)
data_from_prog將被指定為填充欄位(并填充NULL值(如果trailing nullcols指定))- 加載會話結束后,從 Oracle 應用程式更新該列。- 然后你會使用一個簡單的
update陳述句;您在 (PL/)SQL世界中,撰寫這樣的查詢很容易(至少,我希望如此)
uj5u.com熱心網友回復:
在 .prog 檔案中使用 Bash 腳本從頭開始動態創建控制檔案 (.ctl) 似乎有效,我也可以使用這些引數。所以在 .prog 檔案中,我們將有:
echo "5 Concurrent Program Parameter 1 : " ${5} /*this is only to test it*/
/* *Printf* with *>* command will create and edit a file.
Alternative *Printf* with *>>* would append to the file*/
printf "LOAD DATA\n
INFILE 'path_to_csv_file.csv'\n /*this is data for col1, col2 etc*/
INSERT INTO TABLE TABLE_NAME\n
FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n
TRAILING NULLCOLS\n
(COL1,\n
COL2,\n
DATA_FROM_PROG CONSTANT ${5})" > [name and path to control file (e.g./folder/control.ctl)]
這樣,當 .prog 檔案被執行時,它將動態創建 .ctl 檔案,該檔案將包含我們想要的引數 (${5})。我們也可以添加類似這樣的東西來運行 .ctl 檔案
sqlldr userid=user/pass control=[path_to_control]control.ctl log=track.log
另外,還要確保逃脫引號'和雙引號"用\,因為你會得到一些錯誤,否則。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373104.html
標籤:猛击 甲骨文 oracle-sqldeveloper sql-loader
上一篇:我應該如何設定我的sqlnet.ora和tnsnames.ora檔案?
下一篇:有重名時洗掉URL搜索引數?
