使用双列中的列名执行IMMEDIATE

时间:2017-04-23 23:25:20

标签: oracle dynamic-sql dual-table

在我的包裹中,我有一个这样的程序:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   EXECUTE IMMEDIATE 'INSERT INTO T1(SELECT COL.F0, COL.F1 FROM DUAL)';

END IF;

END;
对于表T1,

我只需要两个双列:COL.F0& COL.F1。

当我执行此声明时,我得到了" COL"。" F1"是无效的标识符。

在同一过程中,为了将值插入表T2,我的语句可能如下所示:

 EXECUTE IMMEDIATE 'INSERT INTO T2(SELECT COL.F0, COL.F1, COL.F4 FROM 
  DUAL)';

我会再次遇到类似的问题。你能否建议我在不使用INTO条款的情况下解决这个问题?

1 个答案:

答案 0 :(得分:0)

首先,()语法在查询周围没有括号PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS BEGIN EXECUTE IMMEDIATE 'INSERT INTO T1 AS SELECT :1, :2 FROM DUAL' USING COL.F0, COL.F1; END;

如果使用EXECUTE IMMEDIATE,则该语句是在过程上下文之外执行的字符串,因此它不能引用参数。您需要将它们作为绑定变量提供,例如:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   INSERT INTO T1 AS SELECT COL.F0, COL.F1 FROM DUAL;

END;

但是,我会怀疑你是否需要使用动态SQL - 你可以直接运行插入:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   INSERT INTO T1 VALUES (COL.F0, COL.F1);

END;

此外,在这种情况下,您可以使用单行插入语句,而不是运行"插入作为选择":

WITH A AS (SELECT CASE CHARINDEX(' ', PART_NUMBER, 1)  
            WHEN 0 THEN PART_NUMBER 
            ELSE SUBSTRING(PART_NUMBER, 1, CHARINDEX(' ', PART_NUMBER, 1) - 1) 
            END AS PARTNUMBERPREFIX      
            , PART_NUMBER        
            FROM PRODUCT)
SELECT C.PARTNUMBERPREFIX
    , CASE WHEN RC>1 THEN '' ELSE C.COMPANY_NAME END AS COMPANY_NAME
    , C.PART_NUMBER      
FROM
    (SELECT A.PARTNUMBERPREFIX, A.PART_NUMBER
         , COALESCE(B.COMPANY_NAME,'') AS COMPANY_NAME
         , COUNT(*) OVER (PARTITION BY  '%' + LTRIM(RTRIM(A.PARTNUMBERPREFIX)) + '%') AS RC 
        , ROW_NUMBER() OVER (PARTITION BY  '%' + LTRIM(RTRIM(A.PARTNUMBERPREFIX)) + '%' ORDER BY A.PART_NUMBER) AS RN       
    FROM A
    LEFT JOIN COMPANY B ON B.COMPANY_NAME LIKE ('%' + LTRIM(RTRIM(A.PARTNUMBERPREFIX)) + '%') AND B.TYPE_ID=2
    WHERE A.IS_ACTIVE = 1 
      AND A.PRODUCT_TYPE_ID = 1 
      AND A.IS_SELLABLE = 1 
      ) C
WHERE RN=1

P.S。如果这应该进行插入,为什么程序被称为" directUpdate"? :)