我想创建一个表格来更新我的oracle数据库中的多个表中的一些数据,我必须在不同的组织中使用这个表单。如何通过从数据库获取表名和列名来更新Oracle表?
表我想要使用此脚本
SELECT table_name, column_name
FROM dba_tab_columns
WHERE upper(column_name) LIKE 'PATIENT%'
我的问题是,如果我运行上面的脚本,我会得到不可预料的一组数据来更新我会从表DBA_TAB_COLUMNS得到的,我的意思是一些组织他们有比其他更多的桌子,有些他们有不同名字的相似桌子。所以我希望从我的表单首先读取所有表名和列名与上面的脚本,然后用类似下面的脚本更新该表。
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
你需要动态SQL - '执行immediate' – Tatiana
是什么'emp_rec.column_name'在你的榜样? – Tatiana
sry错误没有emp_rec –