2015-11-11 37 views
0

我想创建一个表格来更新我的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 
+0

你需要动态SQL - '执行immediate' – Tatiana

+0

是什么'emp_rec.column_name'在你的榜样? – Tatiana

+0

sry错误没有emp_rec –

回答

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使用绑定变量

+0

第8行第9列的错误103 在期待以下某项时遇到符号“IMMEDIATE”: :=。(@%; 符号“。=”在“IMMEDIATE” –

+0

我不确定在执行立即执行时使用绑定变量,但尝试更新答案,并且最好发布错误编号,而不仅仅是描述 – Tatiana

+0

必须是这样的:'EXECUTE IMMEDIATE'UPDATE'|| tab.table_name || 'SET'|| tab.column_name ||'=:p1 WHERE'|| tab。column_name ||' =:p2'USING BLK_TOOLS.PATIENT_ID1,BLK_TOOLS.PATIENT_ID2;' –

相关问题