【问题标题】:PL/SQL Procedure Error by dbms output functiondbms 输出函数的 PL/SQL 过程错误
【发布时间】:2019-06-04 17:48:48
【问题描述】:

我有以下任务: “编写一个 Print Siblings 程序(p 个人),输入来自家谱方案的人的姓名或 ID,然后输出兄弟姐妹列表。”

表关系,其中包含一个人的继任者(Nachfolger)和前任者(Vorgänger)的信息。 Table Relations

我的程序如下:

create or replace procedure PrintSiblings4(p_Person varchar2)
is
  cursor c_geschwister is select nachfolger
  from relations
  where nachfolger != p_Person and vorgänger = 
    (select vorgänger from relations
    Where nachfolger = p_Person and rownum = 1) ;
  v_geschwister  c_geschwister%rowtype;
begin
  open c_geschwister;
  loop
    fetch c_geschwister into v_geschwister;
    exit when c_geschwister%NOTFOUND;
    dbms_output.put_line('geschwister' || v_geschwister);
  end loop;
end;

如果我编译该过程,sqldeveloper 会收到以下错误消息:

错误 (14,22):PLS-00306:参数的数量或类型不正确 调用“||”

我不明白为什么它不起作用。我使用显式游标来处理我得到超过 1 行的问题,但它不起作用。

【问题讨论】:

  • 补充建议:始终关闭光标。

标签: sql oracle plsql dbms-output


【解决方案1】:

改变:

dbms_output.put_line('geschwister' || v_geschwister);

到:

dbms_output.put_line('geschwister' || v_geschwister.nachfolger);

这里是您的程序的新(更清洁/更紧凑)版本。我们在这里得到表关系的所有列:

create or replace procedure print_siblings4(p_person varchar2)
is
  cursor c_geschwister is 
  select *
  from relations
  where nachfolger != p_person 
  and vorgänger = 
  (
  select vorgänger 
  from relations
  where nachfolger = p_person 
  and rownum = 1
  ) 
  ;

begin
  for r_geschwister in c_geschwister loop
    dbms_output.put_line('geschwister' || v_geschwister.nachfolger);
  end loop;
end;

【讨论】:

  • 首先非常感谢。你能解释一下为什么需要列名吗?我认为游标仅从“nachfolger”列接收表中的行。在您的解决方案之后,我认为游标接收包括所有列的整行,并且带有“.nachfolger”的信息,他只接受“nachfolger”列内的值。对吗?
  • 因为你的变量 v_geschwister 是一个 rowtye 变量。如果您将其定义为 Relations.nachfolger%type,那么您的第一个版本的代码应该可以工作。
  • 回答您的第二个问题:光标获取您在 SELECT 子句中列出的任何列。所以在这种情况下只是nachfolger。但是由于您已将变量定义为行类型,​​因此您应该在需要任何列值时添加列名。例如,我会将您的程序的新版本放在新答案中。
猜你喜欢
  • 2015-02-24
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多