我想我的問題是最好的一個例子說明:DBMS_SQL.BIND_VAR一個函數(例如SYSDATE)
Declare
example1 varchar2(300) := 'sysdate';
example2 varchar2(300) := 'null';
example3 varchar2(300) := 'user';
example4 varchar2(300) := '''Just some Text''';
cursor_name INTEGER;
rows_processed INTEGER;
BEGIN
cursor_name := dbms_sql.open_cursor;
DBMS_SQL.PARSE(cursor_name, 'UPDATE table_name SET column = :x', DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(cursor_name, ':x', example1);
rows_processed := DBMS_SQL.EXECUTE(cursor_name);
DBMS_SQL.CLOSE_CURSOR(cursor_name);
end;
/
所有「exampleX」變量將被綁定爲一個VARCHAR2,而不是被「翻譯」。
我以前使用Execute Immediate,但由於性能優化,必須切換到DBMS_SQL。隨着執行即時固然有沒有問題,如果你使用這種方法:
Execute Immediate 'UPDATE table_name SET column = ' || example1;
但我不能想辦法與BIND_VARIABLE到archieve這一點。
(當然我可以在解析的語句Concat的變量像執行立即,但我想我會失去性能這樣的性能是非常重要的在這種情況下)。
編輯:
一個例子,更接近現實是:從一個DB(SRC)
將數據複製到另一個數據庫(DEST),在那裏我有這個輔助表:
CREATE TABLE "DEST_TAB_COLUMNS"
( "OWNER" VARCHAR2(30 BYTE),
"TABLE_NAME" VARCHAR2(30 BYTE),
"COLUMN_NAME" VARCHAR2(30 BYTE),
"DATA_TYPE" VARCHAR2(106 BYTE),
"OPERATION_TYPE" VARCHAR2(30 BYTE),
"OPERATION_FUNCTION" VARCHAR2(200 BYTE)
) ;
在這張表中,我定義了我在DEST方面感興趣的列。 而且我可以選擇定義「OPERATION_FUNCTION」來替換某個列值。
因此,條目將如下所示:
SRC_OWNER_NAME | SAMPLE_TABLE | SAMPLE_COL | VARCHAR2 | REPLACE | 'null'
SRC_OWNER_NAME | SAMPLE_TABLE | SAMPLE_COL2 | DATE | REPLACE | sysdate
在SRC方面,我定義了我想要轉換的數據。這是一個簡單的表格,它基本上是這樣:
CREATE TABLE "SRC_TRANSFER_DATA"
( "OWNER" VARCHAR2(30 BYTE),
"TABLE_NAME" VARCHAR2(30 BYTE),
"WHERE_CLAUSE" VARCHAR2(300 BYTE),
) ;
例子: TESTOWNER | SAMPLE_TABLE | SPECIAL_COLUMN = 123
現在程序通過SRC_TRANSFER_DATA循環(在DEST上)並構造MERGE語句。爲了做到這一點,如果該表&列存在規則,它也會在DEST_TAB_COLUMNS表中查找。 如果有一個規則,我的bindvariable添加到我的收藏:
l_hostvariable_map(':p'||l_hostvar_cnt) := r_col.operation_function;
最後我會看在這個集合進行綁定。 最終合併(簡稱)看起來是這樣的:
MERGE INTO dest_table dest
USING
(SELECT table_column FROM src_table WHERE special_column= :p1)
src ON
(dest.special_column= :p2)
WHEN matched
THEN UPDATE SET
dest.column1=src.column1,dest.column2= :p3,dest.column3= :p4
WHEN NOT matched
THEN INSERT
(dest.column1,dest.column2,dest.column3)
VALUES
(src.column1,:p5,:p6)
一些的:PX被一個「功能」。就像編輯前的例子一樣。
我希望這是更清楚,而不是更復雜;)
澄清:這裏的示例變量實際上是表中的字段。這就是爲什麼它的「sysdate」作爲一個字符串,而不是var:= sysdate;因爲該表具有應該爲變量調用什麼「函數」的信息。我必須使用DBMS_SQL,因爲我們有一個動態的綁定變量數量 – SebastianK
我不明白,你能否提供更接近你的** real **代碼的較少「虛構」的例子。 'SYSDATE','USER'或'NULL'肯定不是任何表的列名。 –
@WernfriedDomscheit完成。我希望它可以幫助 – SebastianK