如何根据变量的序列名称取得序列值?

洛卓思学 2008-09-25 11:26:03
如题。
INSERT INTO CHAP4
VALUES (CHAP4_SEQ.NEXTVAL, v_name);
SAVEPOINT A;
CHAP4_SEQ如果是个变量,该如何操作??
...全文
64 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
oracledbalgtu 2008-09-26
  • 打赏
  • 举报
回复
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;
/
[Quote=引用楼主 firmrock 的帖子:]
如题。
INSERT INTO CHAP4
VALUES (CHAP4_SEQ.NEXTVAL, v_name);
SAVEPOINT A;
CHAP4_SEQ如果是个变量,该如何操作??
[/Quote]
robin_ares 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 firmrock 的回复:]
而且还有可能这个序列是不存在的,
[/Quote]
然后自动创建。。
这句比较狠

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;
洛卓思学 2008-09-26
  • 打赏
  • 举报
回复
再次感谢各位的帮助。不胜感激!!

我都准备好在PB中使用更复杂的写法了,呵呵。
洛卓思学 2008-09-26
  • 打赏
  • 举报
回复
我按照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')';
dawugui 2008-09-25
  • 打赏
  • 举报
回复
还有这个

如何用动态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
dawugui 2008-09-25
  • 打赏
  • 举报
回复
参考如下的动态SQL.

create or replace procedure sp_test(yourtable in varchar2,rst sys_refcursor) is
begin
open rst for 'select * from '||yourtable||';
end sp_test;
洛卓思学 2008-09-25
  • 打赏
  • 举报
回复
而且还有可能这个序列是不存在的,然后自动创建。。

3,492

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧