我现在想在存储过程中对一系列表进行操作,除了表名不同,操作都是相同的。怎样可以使用变量作为表名啊?
create or replace procedure case_to_province as
       cursor cur is
       select * from tableName
       ……
我就是想把这个tableName用变量来表示,这样我在调用存储过程的时候,只要换一下参数就可以了,而不用根据不同的表名,来写多个存储过程。

解决方案 »

  1.   

    你把你要执行的sql写成字符串, 表名在字符串中可以用变量,然后用execute immedate 去执行这个字符串 就是执行 这个sql 了。
      

  2.   

    先把sql拼接成v_SQL,然后 EXEC v_SQL IMMEDIATELY;
      

  3.   

    --动态游标  c sys_refcursor;
      str varchar2(4000);
    begin
      str := 'select * from '||tbname;
      open c for str;  --下面用显式调用,和游标一样。
    end; 
      

  4.   

    CREATE OR REPLACE PROCEDURE p01(tabname IN VARCHAR2) AS 
    v_num NUMBER(10);
    v_sql VARCHAR2(300);
    BEGIN 
      v_sql:='select count(*) from '||tabname;
      EXECUTE IMMEDIATE v_sql INTO v_num;
      Dbms_Output.put_line('the total num is '||v_num);
    END p01;EXEC p01('user_sequences');
    输出结果为:
    the total num is 8