代码之家  ›  专栏  ›  技术社区  ›  Moeb

如何使用动态SQL声明从表名派生的列名?

  •  0
  • Moeb  · 技术社区  · 16 年前

    建立在 Tony's answer this question :

    如果我想做这样的事,

    CREATE PROCEDURE A(tab IN VARCHAR2) IS
    tab.col_name <column> --static declaration (column name always remains the same)
    BEGIN
       EXECUTE IMMEDIATE 'INSERT INTO ' || tab(col_name) || 'VALUES(123)';
    END A;
    

    在上述情况下,如何使用动态SQL?

    1 回复  |  直到 9 年前
        1
  •  4
  •   Tony Andrews    16 年前

    此示例传入表名和列名:

    CREATE PROCEDURE A
      ( tab IN VARCHAR2
      , col_name IN VARCHAR2
      ) IS
    BEGIN
       EXECUTE IMMEDIATE 'INSERT INTO ' || tab || '(' || col_name || ') VALUES(123)';
    END A;
    

    您需要意识到,executeimmediate之后的所有内容都必须是包含一些有效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 Plus中显示如下内容:

    值(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;
    
    推荐文章