这是我的代码。请原谅我没有把变量放在声明部分,因为在我提交问题之前,编辑在格式化时给了我很多时间。
我希望结果变量(v_Var)的值打印为
v_ID = :NEW.ID;
v_NAME = :NEW.NAME;
v_ENTITY_ID = :NEW.ENTITY_ID;
但它正在打印为
v_ID = :NEW.ID;
v_ID = :NEW.ID;
v_NAME = :NEW.NAME;
v_ENTITY_ID = :NEW.ENTITY_ID;
由于表TEMP_TRG_CONSTRNT有2行,因此它也适用于v_ID两次。 我知道问题是外部FOR循环,但我不知道如何处理它。
DECLARE
CURSOR c1 IS
SELECT NAME, OCCUR_COUNT FROM IFMS_SYSTEMCONFIGURATION.TEMP_TRG_CONSTRNT;
BEGIN
v_TableName := 'MyTable';
EXECUTE IMMEDIATE 'TRUNCATE TABLE IFMS_SYSTEMCONFIGURATION.TEMP_TRG_CONSTRNT';
INSERT INTO IFMS_SYSTEMCONFIGURATION.TEMP_TRG_CONSTRNT (NAME, OCCUR_COUNT)
SELECT A.FKN, COUNT(A.FKN) AS OCCUR_COUNT FROM
(
SELECT A.CONSTRAINT_NAME AS FKN FROM ALL_CONSTRAINTS A
INNER JOIN ALL_CONS_COLUMNS B
ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
WHERE A.CONSTRAINT_TYPE IN ('P', 'U') AND A.TABLE_NAME = 'MyTable'
)A
GROUP BY A.FKN;
--FOR CONSTR_NAME IN (SELECT NAME FROM IFMS_SYSTEMCONFIGURATION.TEMP_TRG_CONSTRNT)
FOR CONSTR_NAME IN c1
LOOP
--SELECT NAME, OCCUR_COUNT INTO v_Constr_Name, v_Index_Count FROM TEMP_TRG_CONSTRNT WHERE NAME = CONSTR_NAME.NAME;
FOR COL_NAME IN (SELECT COLUMN_NAME FROM ALL_CONS_COLUMNS WHERE CONSTRAINT_NAME = CONSTR_NAME.NAME)
LOOP
v_Var := v_Var || 'v_' || COL_NAME.COLUMN_NAME || ' = :NEW.' || COL_NAME.COLUMN_NAME || ';' || CHR(13);
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_Var);
END LOOP;
END;
答案 0 :(得分:2)
可能会有一些因素导致您的结果:
除此之外,您还通过执行嵌套循环设法重新创建嵌套循环连接。一般来说,这是一个坏主意 - 如果Hash Join更高效,该怎么办?通过使用嵌套游标for循环,您将有效地阻止Oracle。至少,你可以在循环之前在一个sql语句中加入你的两个游标。
但是,看起来您正在尝试生成变量列表而无需键入它们。您可以在单个SQL语句中执行此操作 - 不需要PL / SQL,如下所示:
SELECT DISTINCT con.constraint_name,
con.owner,
con.table_name,
col.column_name,
'v_'||col.column_name||' := :NEW.'||col.column_name||';'
FROM all_constraints con
inner JOIN all_cons_columns col ON con.constraint_name = col.constraint_name
AND con.owner = col.owner
AND con.constraint_type IN ('P', 'U')
--AND con.owner = 'SOME_OWNER' -- uncomment out and put in the correct owner name, esp if your table exists in more than one owner.
AND con.table_name = 'YOUR_TABLE'
ORDER BY con.owner, con.table_name;
请注意,我已添加了额外的列,以便您可以找出为什么您会获得您获得的结果,以防万一与您的结果不匹配;期待着看到。我包含了DISTINCT关键字来处理您为单个owner.table返回多个约束的情况。
如果要同时为多个表生成变量列表,可能需要在上面的查询中使用聚合listagg函数(意味着可以删除DISTINCT),并使用CHR(10)的分隔符。