【问题标题】:PL/SQL: ORA-00913: too many valuesPL/SQL: ORA-00913: 值太多
【发布时间】:2017-01-17 11:18:39
【问题描述】:

我正在尝试创建一个 sql 函数,该函数在给出客户姓名时打印客户所做的预订。客户姓名位于名为 CLIENTS.FNAME CLIENTS.MNAME CLIENTS.LNAME 的表中,预订通过 id-外键搜索 有显示“太多值”错误的函数代码,也许它必须由循环或其他东西来完成?

create or replace FUNCTION cl_reserv(clName VARCHAR2)

RETURN RESERVATIONS%ROWTYPE

IS
resRecord RESERVATIONS%ROWTYPE;

BEGIN
  SELECT RESID,STARTDATE,ENDDATE,ADDINFO INTO resRecord
           FROM RESERVATIONS INNER JOIN CLIENTS ON RESERVATIONS.CLIENTID=CLIENTS.CLIENTID
           WHERE clName IN (FNAME,MNAME,LNAME);
RETURN resRecord;
END;

【问题讨论】:

  • 选择返回多条记录,您尝试将记录列表插入一个变量 - 服务器引发异常
  • 看这篇文章“如何返回collection form pl/sql函数”stackoverflow.com/questions/7888990/…

标签: sql oracle ora-00913


【解决方案1】:

您的 SELECT 子句与您尝试选择的记录不匹配。像这样更改您的代码:

CREATE OR REPLACE FUNCTION cl_reserv(clName VARCHAR2)
    RETURN RESERVATIONS%ROWTYPE 
IS
    resRecord RESERVATIONS%ROWTYPE;

BEGIN
  SELECT r.* INTO resRecord
           FROM RESERVATIONS r INNER JOIN CLIENTS c ON r.CLIENTID=c.CLIENTID
           WHERE clName IN (FNAME,MNAME,LNAME);
    RETURN resRecord;
END cl_reserv;

通过使用r.*,您可以准确选择记录类型所需的列数、类型和顺序。

【讨论】:

  • 或者,您可以指定要返回的记录字段,例如SELECT RESID,STARTDATE,ENDDATE,ADDINFO INTO resRecord.resid, resRecord.startdate, resRecord.enddate, resRecord.addinfo from ...
  • 谢谢您的帮助。当我调用该函数时,我仍然收到有关结果的错误。我正在尝试从 resRecord 获取信息。 '代码' DECLARE res RESERVATIONS%ROWTYPE;开始 cName := cl_reserv('Ivan'); DBMS_OUTPUT.PUT_LINE(res);结尾; '代码'
猜你喜欢
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多