在一个数据库中,每一个表都有一个字段eccode,当我传一个eccode值到这个函数时,删除这个库中所有表中eccode值为传进来的值 的记录 

解决方案 »

  1.   

    因为有delete语句,如果写函数,是不能直接调用的存储过程先用个游标
    select table_name,column_name from all_tab_columns
    where column_name='eccode'然后打开游标,拼个delete语句
    再执行动态sql
      

  2.   

    [code=SQL]CREATE OR REPLACE PROCEDURE sp_del_eccode (in_data IN VARCHAR2)
    IS
       v_table      VARCHAR2 (100);
       delect_sql   VARCHAR2 (1000);   CURSOR c_tbl_names
       IS
          SELECT table_name
            FROM user_tab_columns
           WHERE column_name = 'eccode';
    BEGIN
       OPEN c_tbl_names;   LOOP
          FETCH c_tbl_names
           INTO v_table, v_column;      EXIT WHEN c_tbl_names%NOTFOUND;
          delete_sql := 'delete ' || v_table || ' where eccode=' || in_data;      EXECUTE IMMEDIATE delete_sql;
       END LOOP;   COMMIT;
    EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
          NULL;
       WHEN OTHERS
       THEN
          RAISE;
    END sp_del_eccode;[code]
      

  3.   

    没有测试过,可能有些地方需要修改下,你自己去测试下CREATE OR REPLACE PROCEDURE sp_del_eccode (in_data IN VARCHAR2) 
    IS 
       v_table      VARCHAR2 (100); 
       delect_sql   VARCHAR2 (1000);    CURSOR c_tbl_names 
       IS 
          SELECT table_name 
            FROM user_tab_columns 
           WHERE column_name = 'eccode'; 
    BEGIN 
       OPEN c_tbl_names;    LOOP 
          FETCH c_tbl_names 
           INTO v_table, v_column;       EXIT WHEN c_tbl_names%NOTFOUND; 
          delete_sql := 'delete '  ¦ ¦ v_table  ¦ ¦ ' where eccode='  ¦ ¦ in_data;       EXECUTE IMMEDIATE delete_sql; 
       END LOOP;    COMMIT; 
    EXCEPTION 
       WHEN NO_DATA_FOUND 
       THEN 
          NULL; 
       WHEN OTHERS 
       THEN 
          RAISE; 
    END sp_del_eccode;
      

  4.   

    上面的有点小错误CREATE OR REPLACE PROCEDURE sp_del_eccode (in_data IN VARCHAR2) 
    IS 
       v_table      VARCHAR2 (100); 
       delect_sql   VARCHAR2 (1000);    CURSOR c_tbl_names 
       IS 
          SELECT table_name 
            FROM user_tab_columns 
           WHERE column_name = 'eccode'; 
    BEGIN 
       OPEN c_tbl_names;    LOOP 
          FETCH c_tbl_names 
           INTO v_table;       EXIT WHEN c_tbl_names%NOTFOUND; 
          delete_sql := 'delete '  ¦ ¦ v_table  ¦ ¦ ' where eccode='  ¦ ¦ in_data;       EXECUTE IMMEDIATE delete_sql; 
       END LOOP;    COMMIT; 
    EXCEPTION 
       WHEN NO_DATA_FOUND 
       THEN 
          NULL; 
       WHEN OTHERS 
       THEN 
          RAISE; 
    END sp_del_eccode;