【问题标题】:procedure error ORA-00918: column ambiguously defined过程错误 ORA-00918: 列定义不明确
【发布时间】:2012-05-03 11:42:25
【问题描述】:

任何人都可以帮助解决这个错误:

9/10 PLS-00428: an INTO clause is expected in this SELECT statement

当尝试基于单个参数打印出详细信息时会出现此问题。这是我一直在使用的代码

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (ID_actor CHAR)
 AS
 first_name CHAR(30);
 last_name CHAR(30);
 title CHAR(40);
 year NUMBER;
 role CHAR(40);
quote CHAR(255);
CURSOR print_cursor IS
SELECT a.actorID, a.firstname, a.lastname, m.title as title, m.year as year ,  
 r.rolename as role1 , q.quotechar as quote1 FROM movie m, role r, quote q, rolequote  
rq, actor a WHERE
a.actorID = r.actorID AND
m.movieID = r.movieID AND
rq.quoteID = q.quoteID AND
rq.roleID = r.roleID;
BEGIN  
FOR row IN print_cursor LOOP
SELECT AQ.QUOTES, A.FIRSTNAME, A.LASTNAME 
FROM ACTOR_QUOTES AQ, ACTOR A
Where row.actorID = ID_actor;
END LOOP; 
END PRINT_ACTOR_QUOTES ;
/

【问题讨论】:

  • 请建议您在此过程和光标循环中尝试做什么。
  • 我希望它打印来自 actor 表的 firstname 和 lastname 行以及来自嵌套表 actor_quotes 的 title、year、role 和 quote
  • ACTOR_QUOTES 和 ACTOR 表之间的关系是什么。请提及字段。

标签: plsql oracle10g ora-00918


【解决方案1】:

我假设相关错误是

PLS-00428:此 SELECT 语句中应有一个 INTO 子句

(而不是您在问题标题中提到的那个)。

问题在于您的 FOR 循环中的 SELECT 语句。在 PL/SQL 中,您不能只选择数据而不对其进行任何操作。所以你需要一个 INTO 语句来将检索到的数据存储在一个 PL/SQL 变量中:

SELECT AQ.QUOTES, A.FIRSTNAME, A.LASTNAME
  INTO quote, first_name, last_name
FROM ACTOR_QUOTES AQ, ACTOR A
Where row.actorID = ID_actor;

然后我可以发现几个额外的问题:

  • SELECT 语句似乎是完全外部联接,这很少是您想要的。
  • 如果返回多行,带有 INTO 子句的 SELECT 语句将失败。
  • 如果您在每次迭代中覆盖局部变量并且不对它们执行任何操作,那么 FOR 循环的目的是什么。

【讨论】:

  • 此语句中的 ACTOR_QUOTES 、 ACTOR 表缺少连接条件。
  • 我现在有错误 PL/SQL:ORA-00932:不一致的数据类型:预期 NUMBER 得到了 myusername.aq_nt
  • 你在哪一行得到错误?可能是ID_actor(CHAR 类型)和row.actorID(数字类型?)之间的比较。
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
相关资源
最近更新 更多