這個例子通過在表名和列名:
CREATE PROCEDURE A
(tab IN VARCHAR2
, col_name IN VARCHAR2
) IS
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
END A;
你需要認識到這一切後EXECUTE IMMEDIATE必須是包含一些有效的SQL字符串。驗證這一點的一個好方法是將其設置在一個變量,並輸出到屏幕上:
CREATE PROCEDURE A
(tab IN VARCHAR2
, col_name IN VARCHAR2
) IS
v_sql VARCHAR2(2000);
BEGIN
v_sql := 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
DBMS_OUTPUT.PUT_LINE('SQL='||v_sql);
EXECUTE IMMEDIATE v_sql;
END A;
這應該然後顯示類似下面的SQL加:
SQL = INSERT INTO mytable(mycolumn) VALUES(123)
(提供的服務器輸出已打開)。
編輯:既然你想要的列名是始終具有相同值的局部變量,可以這樣做的:
CREATE PROCEDURE A (tab IN VARCHAR2)
IS
col_name VARCHAR2(30) := 'MYCOLUMN';
v_sql VARCHAR2(2000);
BEGIN
v_sql := 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
DBMS_OUTPUT.PUT_LINE('SQL='||v_sql);
EXECUTE IMMEDIATE v_sql;
END A;
爲什麼negvote? – Moeb 2010-08-09 13:43:56
這是一個很好的問題...... – 2010-08-09 13:46:37