这个例子通过在表名和列名:
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