返回多行时出现ORA-01422错误的解决方法

日期: 2009-09-07 作者:Greg Williams翻译:孙瑞 来源:TechTarget中国 英文

问:我使用以下Oracle过程,根据输入SQL语句的PO ID可以返回一行或者更多行。当返回多行时,我收到了 ORA-01422错误提示。请问我该如何重新编写过程代码,以便一对多地返回数据行?我有一个硬编码的PO ID(‘0700185’)以便测试用。过程应该可以返回所有单据,有可能是一个也有可能是五个。

  请您帮助解释一下,因为我不是DBA,对Oracle来说我只是新手,但我有意愿学习。谢谢!   CREATE OR REPLACE PROCEDURE TESTPNET(PO OUT VARCHAR,&nb……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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;

翻译

孙瑞
孙瑞

相关推荐