我想創建一個表格來更新我的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 –