如题。
 INSERT INTO CHAP4
   VALUES (CHAP4_SEQ.NEXTVAL, v_name);
   SAVEPOINT A;
CHAP4_SEQ如果是个变量,该如何操作??

解决方案 »

  1.   

    参考如下的动态SQL.create or replace procedure sp_test(yourtable in varchar2,rst sys_refcursor) is
    begin
      open rst for 'select * from '||yourtable||';
    end sp_test;
      

  2.   

    还有这个如何用动态SQL实现输入表名能得到表的行数
     CREATE   OR   REPLACE   PROCEDURE   P(P_TABNAME   VARCHAR2) 
        2     AS 
        3     L_SQL   LONG; 
        4     L_CNT   NUMBER; 
        5     BEGIN 
        6     L_SQL   :=   'SELECT   COUNT(*)   FROM   ' | |P_TABNAME; 
        7     EXECUTE   IMMEDIATE   L_SQL   INTO   L_CNT; 
        8     DBMS_OUTPUT.put_line(L_CNT); 
        9     END; 
      10     / Procedure   created. Elapsed:   00:00:00.85 
    T@orcl> EXEC   P('T'); 
    1230966 PL/SQL   procedure   successfully   completed. Elapsed:   00:00:12.42 
    T@orcl> EXEC   P('DUAL'); 
    1 PL/SQL   procedure   successfully   completed. Elapsed:   00:00:00.01
      

  3.   

    然后自动创建。。
    这句比较狠CREATE  OR  REPLACE  PROCEDURE  P(P_SEQNAME  in VARCHAR2) 
      AS 
         L_SQL  varchar2(1000); 
         L_CNT  NUMBER; 
         L_SEQ  NUMBER;
      BEGIN 
         L_SQL  :=  'select  count(1) from  user_sequences  
                    where sequence_name='||P_SEQNAME  ;
         EXECUTE  IMMEDIATE  L_SQL  INTO  L_CNT; 
         if  L_CNT= 0 then
             EXECUTE  IMMEDIATE   'create sequence '||P_SEQNAME;
             L_SEQ :=1;
         else
             L_SQL  :=  'select '||P_SEQNAME||'.NEXTVAL from dual;
             EXECUTE  IMMEDIATE L_SQL into L_SEQ;     
         end if;
         
         DBMS_OUTPUT.put_line(L_SEQ); 
      END; 
      

  4.   

    CREATE OR REPLACE PROCEDURE P(P_SEQNAME VARCHAR2, P_NAME VARCHAR2) AS
      L_SQL VARCHAR2(1000);
      L_CNT NUMBER;
      L_SEQ NUMBER;
    BEGIN
      L_SQL := 'select count(*) from user_sequences where sequence_name= upper(''' ||
               P_SEQNAME || ''')';
      EXECUTE IMMEDIATE L_SQL
        INTO L_CNT;
      IF L_CNT = 0 THEN
        EXECUTE IMMEDIATE 'create sequence ' || P_SEQNAME;
      ELSE
        L_SQL := 'INSERT INTO CHAP4 VALUES (' || P_SEQNAME || '.NEXTVAL,''' ||
                 P_NAME || ''')';
        EXECUTE IMMEDIATE L_SQL;
      END IF;
    END;
    /BEGIN
     p('seq_123','xxx');
    END;
    /
      

  5.   

    我按照Robin_Ares 的写法,修改了一下  select count(*)
        into L_CNT
        from user_sequences
       where sequence_name = s_seqname;  if L_CNT = 0 then
        EXECUTE IMMEDIATE 'create   sequence   ' || s_seqname ||
                          ' start with 2';
        Result := 1;因为这个序列名称是中文,会报错。
    后来发现oracledbalgtu 写的全对!!
    我只是把这个过程更改为函数了。在开发工具里面以及plsql中就可以这样执行了。INSERT INTO CHAP4 VALUES (P_SEQNAME .NEXTVAL,'aaaa')';