【问题标题】:Dynamic Update query in procedure过程中的动态更新查询
【发布时间】:2013-05-22 04:28:49
【问题描述】:

我正在尝试为数据库中所有表中列出的列创建动态更新查询。但是,查询失败并出现错误代码:-942 消息:ORA-00942:表或视图不存在 ORA-06512:在“MANTAS.P_JRSDCN_TR”,第 14 行。

代码:-

CREATE or REPLACE PROCEDURE P_JRSDCN_TR
(
out_error_cd out number,        -- Returns 0 if no error; anything else is an error
out_error_msg out varchar2       -- Returns empty string if no error; otherwise the error and trace
)AUTHID CURRENT_USER
IS
    counter  number(20) :=0;   
CURSOR TAB_COL_CURSOR IS 
SELECT DISTINCT OWNER||'.'||TABLE_NAME as TABLE_NAME,COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME IN ('KDD_REVIEW') AND COLUMN_NAME='JRSDCN_CD';
 BEGIN  
     FOR TAB_COL_REC  IN TAB_COL_CURSOR
     LOOP

EXECUTE IMMEDIATE 'UPDATE TAB_COL_REC.TABLE_NAME SET TAB_COL_REC.COLUMN_NAME = P2||SUBSTR(TAB_COL_REC.COLUMN_NAME,3) WHERE SUBSTR(TAB_COL_REC.COLUMN_NAME,1,2)= PL';

counter := counter +SQL%rowcount ;
 If counter >= 50000 then
     counter := 0;
     --commit;
    end if;

-- Done!    
    out_error_cd := 0;
    out_error_msg := '';
    dbms_output.put_line('Turkey Jurisdiction Update completed sucessfully at ' || to_char(sysdate,'MM/dd/yyyy HH24:MI:SS'));
        END Loop;
exception when others then
        rollback;
        out_error_cd := SQLCODE;
        out_error_msg := substr(sqlerrm, 1, 200) || chr(10) || substr(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 3896);        
        dbms_output.put_line('  Code: ' || out_error_cd);
        dbms_output.put_line('  Message: ' || out_error_msg);
        dbms_output.put_line('Turkey Jurisdiction Update FAILED at ' || to_char(sysdate,'MM/dd/yyyy HH24:MI:SS'));
 end;
 /

感谢您在此过程中提供的帮助。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    可能没有名为TAB_COL_REC.TABLE_NAME的表

    你可能想要这样的东西:

    EXECUTE IMMEDIATE 'UPDATE ' || TAB_COL_REC.TABLE_NAME || ' SET ' || TAB_COL_REC.COLUMN_NAME || ' = P2||SUBSTR(' || TAB_COL_REC.COLUMN_NAME ||',3) WHERE SUBSTR(' || TAB_COL_REC.COLUMN_NAME || ',1,2)= PL';
    

    【讨论】:

    • 嗨凯德我修改了查询
    【解决方案2】:

    【讨论】:

    • 嗨 Sindhu,感谢您的回复。该表存在并且数据库用户是该表的所有者,因此我看到它可以修改并且我可以在程序之外进行操作。问题是当我尝试立即执行时它不起作用。我是否缺少任何语法错误..我是 PL/SQL 的新手,所以我不确定我缺少什么。
    【解决方案3】:

    http://vijvipin.wordpress.com/2009/02/18/plsql-finding-a-column-name-in-all-tables/

    从 all_tab_columns 中选择 a.table_name、column_name、DATA_TYPE、DATA_LENGTH
    一个,USER_ALL_TABLES u 其中 a.TABLE_NAME=u.TABLE_NAME 和 column_name 像“empid%” 按 DATA_LENGTH desc 排序;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2021-08-05
      • 2023-03-16
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多