2015-11-11 44 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;' –

相關問題