【问题标题】:How to display cursor in procedure?如何在程序中显示光标?
【发布时间】:2019-03-25 14:54:44
【问题描述】:

我必须显示团队中拥有相同经理的每个人的姓名和姓氏(他的姓名和姓氏取自参数)。

我在 VARCHAR2 之前尝试了“IN”。我确实使用了 set serveroutput on。 此外,单独从光标中选择是有效的。

CREATE OR REPLACE PROCEDURE ex_2h(nazw VARCHAR2, imi VARCHAR2)
IS
CURSOR team IS SELECT * FROM people p WHERE p.id_manager= 
(SELECT id_ppl FROM people WHERE name= imi AND surname=nazw);
tmp people%ROWTYPE;
BEGIN
OPEN team;
LOOP
    FETCH team INTO tmp;
    EXIT WHEN team%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(NVL(tmp.name, '?'));
END LOOP;
CLOSE team;
END;

我不知道为什么没有参数它可以工作,但是如果我添加这些,光标是空的并且它不显示任何东西。

【问题讨论】:

  • 经过测试,除了这个 zespol/team 问题它有效。也许您将其称为ex_2h('Franciszek', 'Smuda') 而不是ex_2h('Smuda', 'Franciszek')?;
  • 问题解决了,谢谢指教,不过是sql developer出了点问题。解释如下。

标签: oracle stored-procedures plsql cursor


【解决方案1】:

谁知道?该过程本身看起来不错(除了您打开了 TEAM 游标并从 ZESPOL 获取(从未声明过)这一事实之外。

  • 可能是字母大小写(这些名称是小写/大写/混合大小写)?
  • 您是否对参数的顺序感到困惑?先姓,后姓?反之亦然(即imi VARCHAR2, nazw VARCHAR2
  • 总是使用别名,尤其是当您使用同一个表两次(或多次)时

这是一个测试用例,如果您正确使用它,它会显示它工作。请注意,我已切换到更易于维护的光标 FOR 循环。

SQL> create table people
  2    (id_ppl     number,
  3     name       varchar2(10),
  4     surname    varchar2(10),
  5     id_manager number);

Table created.

SQL> insert all
  2    into people values (1, 'Little', 'Foot', 1)   --> the same ...
  3    into people values (2, 'Big'   , 'Foot', 1)   --> ... manager
  4    into people values (3, 'Stack' , 'Over', 2)
  5  select * from dual;

3 rows created.

SQL> set serveroutput on;

程序:

SQL> create or replace procedure ex_2h (p_nazw in varchar2, p_imi in varchar2)
  2  is
  3  begin
  4    for tmp in (select p.name from people p
  5                where p.id_manager = (select p1.id_ppl
  6                                      from people p1
  7                                      where p1.name = p_imi
  8                                        and p1.surname = p_nazw
  9                                     )
 10               )
 11    loop
 12      dbms_output.put_line(nvl(tmp.name, '?'));
 13    end loop;
 14  end;
 15  /

Procedure created.

测试:

SQL> exec ex_2h('Foot', 'Little');
Little
Big

PL/SQL procedure successfully completed.

SQL>

我建议你这样尝试。如果它不起作用,请发布更多信息 - CREATE TABLE 和示例数据,以便我们了解您的真实情况以及 Oracle 如何响应(以及原因)。

【讨论】:

  • 我的同事使用 for 循环将这个程序发给我,它成功了,然后我再次编译,它也没问题...我只花了一天时间在这个 meh
  • 还是非常感谢。
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2011-08-18
  • 2012-01-24
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多