在我的包裹中,我有一个这样的程序:
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条款的情况下解决这个问题?
答案 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"? :)