问:我使用以下Oracle过程,根据输入SQL语句的PO ID可以返回一行或者更多行。当返回多行时,我收到了 ORA-01422错误提示。请问我该如何重新编写过程代码,以便一对多地返回数据行?我有一个硬编码的PO ID(‘0700185’)以便测试用。过程应该可以返回所有单据,有可能是一个也有可能是五个。
请您帮助解释一下,因为我不是DBA,对Oracle来说我只是新手,但我有意愿学习。谢谢! CREATE OR REPLACE PROCEDURE TESTPNET(PO OUT VARCHAR,&nb……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号

TechTarget
官方微博

TechTarget中国
问:我使用以下Oracle过程,根据输入SQL语句的PO ID可以返回一行或者更多行。当返回多行时,我收到了 ORA-01422错误提示。请问我该如何重新编写过程代码,以便一对多地返回数据行?我有一个硬编码的PO ID('0700185')以便测试用。过程应该可以返回所有单据,有可能是一个也有可能是五个。
请您帮助解释一下,因为我不是DBA,对Oracle来说我只是新手,但我有意愿学习。谢谢!
CREATE OR REPLACE PROCEDURE TESTPNET(PO OUT VARCHAR, BATCH OUT VARCHAR2, VOUCHER OUT VARCHAR2, INVOICE OUT VARCHAR2) AS BEGIN SELECT PO_ID,GRP_AP_ID, VOUCHER_ID, INVOICE_ID INTO PO, BATCH, VOUCHER, INVOICE FROM PS_VOUCHER WHERE PO_ID = '0700185'; DBMS_OUTPUT.PUT_LINE(PO); DBMS_OUTPUT.PUT_LINE(BATCH); DBMS_OUTPUT.PUT_LINE(VOUCHER); DBMS_OUTPUT.PUT_LINE(INVOICE); END TESTPNET; |
答:你所创建的过程使用了SQL,而这只应该在希望返回一行时使用。如果你希望返回多行数据,你应该使用游标。我添加了一个游标C1(参见第二个过程)。第二个过程中使用了循环来遍历选定的记录。
CREATE OR REPLACE PROCEDURE testpnet ( po OUT VARCHAR, batch OUT VARCHAR2, voucher OUT VARCHAR2, invoice OUT VARCHAR2 ) AS BEGIN SELECT po_id, grp_ap_id, voucher_id, invoice_id INTO po, batch, voucher, invoice FROM ps_voucher WHERE po_id = '0700185'; close; DBMS_OUTPUT.put_line (po); DBMS_OUTPUT.put_line (batch); DBMS_OUTPUT.put_line (voucher); DBMS_OUTPUT.put_line (invoice); END testpnet; /************* Cursor **************/ CREATE OR REPLACE PROCEDURE testpnet ( po OUT VARCHAR, batch OUT VARCHAR2, voucher OUT VARCHAR2, invoice OUT VARCHAR2 ) AS cursor c1 is select po_id, grp_ap_id, voucher_id, invoice_id from ps_voucher where po_id = '0700185'; BEGIN open c1; loop fetch c1 into po, batch, voucher, invoice; exit when c1%NOTFOUND; end loop; close; DBMS_OUTPUT.put_line (po); DBMS_OUTPUT.put_line (batch); DBMS_OUTPUT.put_line (voucher); DBMS_OUTPUT.put_line (invoice); END testpnet; |
翻译
相关推荐
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。
-
如何应对Oracle EBS实施中的六个挑战?
在18个月的时间里,Vitamix启动运行了Oracle电子商务套件(E-Business Suite,EBS),而且Vitamix还对诸如Oracle ATG Web Commerce等所有页面属性进行了重新整理,并实现了全球数据中心。
-
Oracle的云产品“砸了自己脚”?
Sparc和Solaris都是Oracle云计划的一部分,但是硬件和支持人员的减少意味着本地Solaris和Sparc将变得更加稀少。
-
2017年3月数据库流行度排行榜 Oracle卫冕之路困难重重
时隔一个月,数据库市场经过一轮“洗牌”,旧的市场格局是否会被打破,曾经占巨大市场份额的企业是否可能失去优势?