找不到光标和表格
Posted
技术标签:
【中文标题】找不到光标和表格【英文标题】:Cursor and table cannot be found 【发布时间】:2012-04-26 07:11:08 【问题描述】:我有一个程序可以从某些表中选择 MAX,但由于某种原因它无法找到这些表。有人能帮帮我吗?
declare
varible1 varchar2 (255);
temp varchar2 (255);
last_val number(9,0);
cursor c1 is Select distinct table_name from user_tab_cols order by table_name;
begin
FOR asd in c1
LOOP
temp := asd.table_name;
varible1 := '"'||temp||'"';
select max("id") into last_val from varible1 ;
END LOOP;
end;
例如,第一个表名是acceptance_form,对于select,我需要使用“acceptance_form”。
编辑后的代码:
declare
varible1 varchar2 (255);
temp varchar2 (255);
last_val number(9,0);
cursor c1 is Select distinct table_name from user_tab_cols where column_name = 'id';
begin
FOR asd in c1
LOOP
temp := asd.table_name;
execute immediate 'select NVL(max('||'id'||'),0) from "'||varible1||'"' into last_val;
END LOOP;
end;
不能因为 db 区分大小写 Oracle express 10g 表和行是这样创建的
CREATE TABLE "ADMINMME"."acceptance_form"
(
"group_id" NUMBER(9, 0),
"id" NUMBER(4, 0) DEFAULT '0' NOT NULL ,
"is_deleted" NUMBER(4, 0),
"name" NVARCHAR2(30) NOT NULL
);
你能告诉我如何处理不存在的异常序列吗? 没关系的异常是在错误的块中:)
declare
temp varchar2 (255);
last_val number(9,0);
cursor c1 is Select distinct table_name from user_tab_cols where column_name = 'id';
begin
FOR asd in c1
LOOP
temp := asd.table_name;
execute immediate 'select NVL(max("id"),0)+1 from "'||temp||'"' into last_val;
begin
EXECUTE IMMEDIATE 'drop sequence "seq_'|| temp||'"';
EXECUTE IMMEDIATE 'create SEQUENCE "seq_'|| temp ||'" MINVALUE '||last_val||'MAXVALUE 999999999999999999999999999 INCREMENT BY 1 NOCACHE';
EXECUTE IMMEDIATE 'select '||temp||'.nextval from dual';
EXECUTE IMMEDIATE 'ALTER SEQUENCE "seq_'||temp||'" INCREMENT BY 1';
exception when others then
null;
end;
END LOOP;
end;
【问题讨论】:
您的光标现在更好了,但 column_name 使用大写:column_name = 'ID'
【参考方案1】:
动态 sql 不能以这种方式工作。
declare
varible1 varchar2 (255);
temp varchar2 (255);
last_val number(9,0);
cursor c1 is Select distinct table_name from user_tab_cols order by table_name;
begin
FOR asd in c1
LOOP
temp := asd.table_name;
begin
execute immediate 'select max(id) from '||temp into last_val;
dbms_output.put_line('max(id) for table: ' ||temp||' = '||last_val);
exception when others then
dbms_output.put_line('Failed to get max(id) for table: ' ||temp);
end;
END LOOP;
end;
【讨论】:
如果最大 ID 不存在,我如何处理异常? 你可以添加一个开始结束块来捕捉它。但是您可以测试列 id 是否存在...我将编辑我的答案以添加异常捕获。 我现在完成了,但我不知道为什么它告诉我错误报告:ORA-01741:非法零长度标识符 ORA-06512:在第 10 行 01741。00000 -“非法零长度标识符”*原因:*行动: 你可以使用Select table_name from user_tables order by table_name
已更正。应该选择max(id)
而不是max('||id||')
【参考方案2】:
您不能使用变量作为表名。
您可以做的是将完整的 sql 语句创建为字符串并使用立即执行
以下是一些示例:http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/dynamic.htm#CHDGJEGD
【讨论】:
以上是关于找不到光标和表格的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb - 聚合和batchSize - 1分钟后找不到光标
易语言问题 错误(36): 找不到指定的对象成员命令名称“取文本长度”。