【问题标题】:Save answer of a query in a variable PL/SQL将查询的答案保存在变量 PL/SQL 中
【发布时间】:2021-04-13 07:54:19
【问题描述】:

我想将查询的答案保存到一个变量中,然后我会检查各个值。

FUNCTION F_capa(
v_carId car.carid%Type,
v_snumber box.snumber%Type)
  RETURN Boolean
IS
 
 type t_box is Table OF box%rowtype;
 v_possibleBox t_box := t_box();
 
BEGIN
 SELECT  b.carid, COUNT(p.trayID) AS amaunt,b.capacity ,b.date
 INTO  v_possibleBox
 FROM Box b
 left JOIN place p on b.carID = p.carID
 WHERE b.snumber = v_snumber
 GROUP BY b.carID, b.date, b.capacity ;
 
 --  LOOP IF(  v_carId = v_possibleBox(i).carID)  Something like that

 End;

但我总是收到这个错误。

ORA-00947: not enough values

我对 PLSQL 比较陌生,我真的很怀疑这个网站,所以我会很感激任何帮助。

【问题讨论】:

    标签: function plsql sqldatatypes


    【解决方案1】:

    ORA-00947 告诉您查询返回的值与 v_possibleBox 记录不匹配。明显的问题是您创建的 amaunt 列。 t_box 类型与您的表具有相同的结构(实际上您并不需要它,它只是 box%rowtype 的别名)并且该表不会有 amaunt 列。

    在这种情况下,使用 Cursor for 循环可能会做得更好,它具有以下结构:

    FOR record IN (select_statement)
    LOOP
        process_record_statements;
    END LOOP; 
    

    record 成为与您的 select 语句返回的列匹配的类型的记录,因此在循环内部 record.amaunt 将起作用。顺便说一句,您不必调用记录记录,所以for myName IN (select statement) 很好。

    如果您想使用原始构造,则需要定义t_box,使其具有与 SQL 返回的相同的列和类型。

    【讨论】:

    • 谢谢您,先生,这正是我的意思。
    【解决方案2】:

    如果您发布更多信息会更简单(这样我就不必自己创建对象),但是好的 - 给您。

    示例表:

    SQL> create table box as
      2    select 1 carid, 100 capacity, trunc(sysdate) datum from dual union all
      3    select 2 carid, 200 capacity, trunc(sysdate) datum from dual;
    
    Table created.
    

    在 SQL 级别声明的类型(不在 PL/SQL 代码中!); t_box 匹配box 表,加上额外的c_count,否则您不能将count(*) 值放入其中,因为表中不存在该列(amount,对吗?):

    SQL> create or replace type t_box as object
      2    (carid    number,
      3     capacity number,
      4     datum    date,
      5     c_count  number
      6    );
      7  /
    
    Type created.
    
    SQL> create or replace type t_boxt as table of t_box;
      2  /
    
    Type created.
    

    PL/SQL 代码:注意第 4 行。如果没有t_box(...),你会得到旧的“没有足够的值”错误(自己试试看):

    SQL> set serveroutput on
    SQL> declare
      2    v_possiblebox t_boxt;
      3  begin
      4    select t_box(b.carid, b.capacity, b.datum, count(*))   --> you miss T_BOX()
      5      bulk collect into v_possiblebox
      6      from box b
      7      group by b.carid, b.capacity, b.datum;
      8    dbms_output.put_line('Count = ' || v_possiblebox.count);
      9  end;
     10  /
    Count = 2
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    现在它工作了

    【讨论】:

    • 谢谢你的例子,它帮助我理解了我的错误在哪里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多