如何通过从数据库中获取表名和列名来更新Oracle表?

时间:2015-11-11 07:18:06

标签: sql database oracle plsql dynamic-sql

我想创建一个更新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

1 个答案:

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