将查询的答案保存在变量 PL/SQL 中
Save answer of a query in a variable PL/SQL
我想将查询的答案保存到一个变量中,然后我检查它并检查各个值。
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 的新手,我真的很怀疑这个网站,所以我将不胜感激任何帮助。
ORA-00947 告诉您查询返回的值与 v_possibleBox 记录不匹配。明显的问题是您创建的 amaunt 列。 t_box 类型与你的 table 具有相同的结构(事实上你并不真正需要它,它只是 box%rowtype 的别名)并且 table 不会有专栏 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.
返回的相同的列和类型
如果您发布更多信息(这样我就不必自己创建对象)会更简单,但是好的 - 给你。
样本table:
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
table,加上额外的 c_count
,否则你不能将 count(*)
值作为该列(amount
,对吧?)在 table:
中不存在
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>
现在 有效。
我想将查询的答案保存到一个变量中,然后我检查它并检查各个值。
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 的新手,我真的很怀疑这个网站,所以我将不胜感激任何帮助。
ORA-00947 告诉您查询返回的值与 v_possibleBox 记录不匹配。明显的问题是您创建的 amaunt 列。 t_box 类型与你的 table 具有相同的结构(事实上你并不真正需要它,它只是 box%rowtype 的别名)并且 table 不会有专栏 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.
如果您发布更多信息(这样我就不必自己创建对象)会更简单,但是好的 - 给你。
样本table:
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
table,加上额外的 c_count
,否则你不能将 count(*)
值作为该列(amount
,对吧?)在 table:
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>
现在 有效。