我不会用一个程序,但查询生成最终的查询。
动态SQL的种类。
简单的例子 - 让我们说,我们对他们有以下表和数据:
CREATE TABLE CustomerTable(
Custromer_Number int,
Address varchar2(100),
order_Number int,
Contact int,
Country varchar2(10),
Post_Code varchar2(10),
Amount number
);
INSERT ALL
INTO CustomerTable VALUES (1, 'aaa', 1, 1, 'AA', '111', 111.11)
INTO CustomerTable VALUES (2, 'bbb', 2, 2, 'BB', '222', 222.22)
SELECT 1 FROM dual;
CREATE TABLE StagingCustTable
AS SELECT t.*, 1 As run_id, 1 as record_id
FROM CustomerTable t
WHERE 1=0;
INSERT ALL
INTO StagingCustTable VALUES (1, 'aaa', 1, 1, 'AA', '111', 111.11, 1, 1)
INTO StagingCustTable VALUES (3, 'ccc', 3, 3, 'CC', '333', 333.33, 3, 3)
SELECT 1 FROM dual;
commit;
现在,当你运行这个简单的查询:
SELECT 'SELECT ' || listagg(column_name, ',') WITHIN GROUP (ORDER BY column_id)
|| chr(10) || ' FROM ' || max(table_name)
|| chr(10) || ' MINUS '
|| chr(10) || 'SELECT ' || listagg(column_name, ',') WITHIN GROUP (ORDER BY column_id)
|| chr(10) || ' FROM StagingCustTable ' as MySql
FROM user_tab_columns
WHERE table_name = upper('CustomerTable');
,你会得到以下结果:
MYSQL
-------------------------------------------------------------------------
SELECT CUSTROMER_NUMBER,ADDRESS,ORDER_NUMBER,CONTACT,COUNTRY,POST_CODE,AMOUNT
FROM CUSTOMERTABLE
MINUS
SELECT CUSTROMER_NUMBER,ADDRESS,ORDER_NUMBER,CONTACT,COUNTRY,POST_CODE,AMOUNT
FROM StagingCustTable
现在只需复制上面的查询,将其粘贴到您的SQL客户端,运行它 - 任务在几分钟内完成。
Run_Id和Record_Id可以被忽略以获得差异。 – MathurS
如何使用最终的“minus”查询的结果?对于“立即执行”,您将不得不选择需要事先了解结构的变量或集合。您可以使用'dbms_sql'来打开一个基于从表列构造的查询的引用游标,但是接下来需要处理这个引用游标。 (这可能与SQL \ * Plus“print”命令一样简单,但取决于您的意图)。除非你真的需要这个程序,否则krokodilko的方法会简单得多。 –