Oracle中的两个问题(200分)

  • 主题发起人 主题发起人 教父
  • 开始时间 开始时间

教父

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如何一次性生成多个trigger?
我在一个文本中包含了多个trigger,每个trigger都是经过测试的,单独在SQL Explorer
中执行没有问题,但是把它们一起执行则不行,它只建立第一条trigger,内容则是所有的
trigger的总和。由于trigger比较多,一个一个执行比较麻烦,请问有什么办法一次就可以
搞定?

2、为什么每次新生成的trigger总是通不过编译,非要改动一点,比如加个空格,就可以
通过编译?trigger多的时候,这也会死人啊!! :(
 
哎,谁叫你直接在sql*plus中运行啊,在那儿运行错误极多,下载一个pl/sql developer
吧!!!!好用多了。
 
create or replace trigger ..
begin
end

create or replace trigger ..
begin
end
怎么会只建立一个Trigger呢?搞不懂。
 
SQL Explorer中的SQL只会被认为是单条语句,你可以在SQL*Plus中执行你的文本。
格式如下:SQL> @x:/>Directory/filename

至于你说的第二个问题,可能也是这方面的原因,但是你没有提供具体示例,
我也就没办法帮你了。不会你加一个空格就影响触发器是否创建成功吧?
 
说实话,我不太会用sql*plus,我试了@文件,但是不执行,搞不清楚怎么回事。
下面是我的两个trigger,你们看看有没有什么问题?这些trigger本身都是通过
编译和测试了的。

/*COMPANY_HALTING*/
CREATE OR REPLACE TRIGGER "CNINFO"."ZYPF10_1" AFTER INSERT OR
UPDATE OF "BEIZHU", "FUPAISJ", "GUPIAODM", "GUPIAOJC",
"TINGPAIQDSJ", "TINGPAIYY"
ON "COMPANY_HALTING"
FOR EACH ROW
begin
update cninfo.F10_modified set F1=1
where StockID like Concat('_',:new.Gupiaodm);
end;


/*PROFIT_SHARING*/
CREATE OR REPLACE TRIGGER "CNINFO"."ZYPF10_2" AFTER INSERT OR
UPDATE OF "JIGOUBM", "SHISHIFAGBSJ", "SHISHIFANR"
ON "PROFIT_SHARING"
FOR EACH ROW
declare
sstockid varchar2(7);
begin
sstockid := Concat(Upper(SubStr(:new.jigoubm, 4, 1)), SubStr(:new.jigoubm, 6, 6));
update cninfo.f10_modified set F1=1,F2=1
where StockID = sStockID;
end;

to armyjiang:确确实实是随便在什么地方加个空格就行了,通过编译后再把空格删掉也不
会有问题。
 
to 教父:
将你上面写的那么多代码存成一个文件如:c:/aa.sql,进入SQL*PLUS,运行:
@c:/aa.sql; //执行,记得后面的分号不要漏
你也可以在SQL*PLUS中直接编辑:edit c:/aa.sql;
 
你用的是什么版本的oracle? 我这里是 oracle8.1.7 企业版
你可以不用sql*plus,那是个dos界面的,对命令不熟可能不太好用
你可以用sqlplus worksheet,是windows界面的,你把写的东东贴过去
执行就ok啦,只是别忘了在 end和下一个create之间打一个 "/"来分隔。

至于第二个问题嘛,原理上,如果你执行的trigger没有出错,就应该是valid状态
不过,如果你运行的时候出了问题,就有可能是这样。它仅仅把你的代码加了进去
没有编译,所以你要手工编译。而你对原来的代码不做修改的话,编译的按钮又是无效的。


 
to wind2000: 我就是用的edit s,然后把上述的内容copy进去,然后@s.sql;
但它是跳到下一行,好象还让我继续输入而不是立即执行,搞不清楚。
to Walone:我的也是8.1.7。我的那些trigger都是在一个服务器上调试好了的,
没有问题,现在是要导入另一个服务器,现在是我每执行一个Create trigger...
后,可以看到这个trigger,编译的按钮也是可用的,但是就是它的状态就是
invalid,非要我改动一下才能通过编译成为valid,实在是搞不懂。 :(
 
几种方式:
1. 找外部的SQL开发管理工具。
如果有那么多Trigger要你生成和管理,最好还是找个工具算啦!

2. 在SQL*Plus中不要运行文件,直接将文件用文本编辑器打开,复制(分段,不能太大,可
以每个Trigger进行),粘贴到SQL>状态下,再输入"/"键,回车,即可完成Trigger的建立工作。

3. 以@的方式运行文件也是可行的,你可以将每个Trigger的结束的";"删除,在新的一行里
增加"/",这样同样可以完成文件中的所有动作。
 
在每个trigger后加 /

/*COMPANY_HALTING*/
CREATE OR REPLACE TRIGGER "CNINFO"."ZYPF10_1" AFTER INSERT OR
UPDATE OF "BEIZHU", "FUPAISJ", "GUPIAODM", "GUPIAOJC",
"TINGPAIQDSJ", "TINGPAIYY"
ON "COMPANY_HALTING"
FOR EACH ROW
begin
update cninfo.F10_modified set F1=1
where StockID like Concat('_',:new.Gupiaodm);
end;
/

/*PROFIT_SHARING*/
CREATE OR REPLACE TRIGGER "CNINFO"."ZYPF10_2" AFTER INSERT OR
UPDATE OF "JIGOUBM", "SHISHIFAGBSJ", "SHISHIFANR"
ON "PROFIT_SHARING"
FOR EACH ROW
declare
sstockid varchar2(7);
begin
sstockid := Concat(Upper(SubStr(:new.jigoubm, 4, 1)), SubStr(:new.jigoubm, 6, 6));
update cninfo.f10_modified set F1=1,F2=1
where StockID = sStockID;
end;
/
 
用SQL *PLUS执行不了很多语句的。多了他就不动了。建议找别的东西。我用的TOAD很
好用。
 
问题解决,原来就是要在后面加个'/',唉,这么个小东西折磨了我这么久,等闲下来
真的要找书来好好看看。

我以前创建trigger都是在SQL Explorer中执行的SQL语句,就会出现通不过编译的情况,
现在在SQL Plus中执行就没有问题,奇怪,难道是SQL Explorer的问题?

to armyjiang:那个“;”是万万不能删的 :(
 
不好意思,有些条件没有分析清楚。
我用工具(SQL Navigator),好象不需要";"的。

不管如何,恭喜你问题得到解决!
 
to armyjiang:真的很感谢你及其它朋友的帮忙,谢谢。
 
'/'是立即执行的意思啦!!!!
 
后退
顶部