我想创建一个使用PL SQL的存储过程,它允许我查找包含特定列的所有表,然后从那些表中删除具有特定值的表中的记录柱。PL SQL-使用动态SQL生成删除语句
例如,我想查找所有具有“年”列的表,然后从所有具有年份“2012”的表中删除所有记录(今年将是执行时输入的参数)
我在这方面的尝试是创建一个存储过程,使用一个游标来获取所有具有此列“年”的表,然后使用动态SQL循环该游标,这将生成我的删除语句我可以执行。
CREATE OR REPLACE PROCEDURE year_deletion
(
p_year NUMBER --Input of the year for records to be deleted
)
IS
CURSOR c1 --Cursor that will find all tables that have the YEAR column
IS
SELECT owner, table_name
FROM all_tab_columns
WHERE column_name = 'YEAR'
AND owner = 'GTP';
BEGIN
FOR i IN c1 LOOP --Loop through all of the tables that the cursor found, generate a SQL statement for each table that will delete all of the records that have the year of p_year
EXECUTE IMMEDIATE ('SELECT * FROM' ||i.table_name|| 'WHERE YEAR = '||p_year||';');
END LOOP;
END;
免责声明:我使用的是SELECT * FROM代替DELETE *从用于测试目的,我会当此过程正确执行改变这一点。
到目前为止,此存储过程编译正确,但在执行期间给我一个错误,期望FROM关键字但未找到。这是用于我的目的的最佳方法吗?
你需要* FROM后添加空格*所以不是* ... FROM * – Hawk
'*,它应该从*' ||操作符将i.table_name粘贴到FROM,然后您将会得到一个像FROMi.table_name这样的单词,这当然不是编译器寻找的内容 – Hawk
还需要在'WHERE YEAR = =中添加空格= ...它应该'WHERE YEAR =' – Aitor