我想创建一个更新oracle数据库中多表中某些数据的表单,我必须在不同的组织中使用此表单。
表格我要更新的内容我将通过使用此脚本从表dba_tab_columns中获取
SELECT table_name, column_name
FROM dba_tab_columns
WHERE upper(column_name) LIKE 'PATIENT%'
我的问题是,如果我运行上面的脚本,我会得到不可预测的数据集,我的意思是某些组织他们有比其他更多的表,有些组织有一个不同名称的类似表。所以我希望从我的表单首先用上面的脚本读取所有表名和列名,然后使用类似下面的脚本更新该表。
UPDATE <target_table_name>
SET <target_column_name> = :BLK_TOOLS.PATIENT_ID1
WHERE <target_column_name> = :BLK_TOOLS.PATIENT_ID2;
怎么做?
我尝试按照以下方式执行数据库程序,但它无法正常工作。
CREATE OR REPLACE PROCEDURE HIMS.merge9898
(PID1 NUMBER, PID2 VARCHAR2) IS
TYPE tab_array IS TABLE OF VARCHAR2(40)
INDEX BY binary_integer;
TYPE col_array IS TABLE OF VARCHAR2(40)
INDEX BY binary_integer;
v_dml_str VARCHAR2 (200);
v_tab_array tab_array;
v_col_array col_array;
BEGIN
SELECT table_name,column_name BULK COLLECT
INTO v_tab_array,v_col_array
FROM sys.dba_tab_columns
where upper(column_name) like'PATIENT%' and global_stats='YES';
FOR i IN v_tab_array.first..v_tab_array.last LOOP
v_dml_str := 'UPDATE '
|| v_tab_array(i)
|| ' SET '||v_col_array(i)||' = :PID1'
|| ' WHERE '||v_col_array(i)||' = :PID2';
EXECUTE IMMEDIATE v_dml_str USING PID1, PID2;
END LOOP;
END;
/
并显示此错误
LINE/COL ERROR
-------- -----------------------------------------------------------------
12/3 PL/SQL: SQL Statement ignored
14/12 PL/SQL: ORA-00942: table or view does not exist
答案 0 :(得分:1)
像这样。
BEGIN
FOR tab IN (select table_name,column_name from dba_tab_columns where upper(column_name) like'PATIENT%') LOOP
EXECUTE IMMEDIATE 'UPDATE '||tab.table_name||
' SET '|| tab.column_name ||' = '|| :BLK_TOOLS.PATIENT_ID1 ||
' WHERE '||tab.column_name ||' = '|| :BLK_TOOLS.PATIENT_ID2;
END LOOP;
END;
OR
BEGIN
FOR tab IN (select table_name,column_name from dba_tab_columns where upper(column_name) like'PATIENT%') LOOP
EXECUTE IMMEDIATE 'UPDATE '||tab.table_name||
' SET '|| tab.column_name ||' = :1
WHERE '||tab.column_name ||' = :2'
USING :BLK_TOOLS.PATIENT_ID1 ,:BLK_TOOLS.PATIENT_ID2 ;
END LOOP;
END;
不确定在动态sql中使用绑定变量