我正在try 将数据插入到一个forall循环中.在这种情况下,我不能使用临时变量并预先设置函数的结果.

该函数只是将一个数字映射到一个字符串:

create or replace function GetInvoiceStatus(status number)
    return nvarchar2
as
begin
    case status
        when 0 then return 'New';
        when 200 then return 'Sent';
        when 300 then return 'Accepted';
        end case;

    return '';
end; 

当我像这样调用此函数时:

select GetInvoiceStatus(200) from dual;

我得到了适当的结果.

然而,当我try 插入数据时,我得到了错误. 这forall个插页:

forall i in 1.. INVOICE_DATA.COUNT
insert into "InvoiceAudit"
("PropertyName", "OldValue", "NewValue" (
            VALUES ('Status', (GetInvoiceStatus(invoice_data(i).status)),
                    ((GetInvoiceStatus((select "Status" from "Invoice" where "InvoiceId" = invoice_data(i).invoiceId)))));

但是,我得到以下错误:

[65000][6592]ORA-06592: 执行CASE语句时未找到CASE[2023-06-01 15:02:57] ORA-06512:"PUBLIC.GETINVOICESTATUS",第9行[2023-06-01 15:02:57] ORA-06512:"PUBLIC.INVOICESSP"第63行[2023-06-01 15:02:57] 职位:5

我已经仔细判断过了,并且INVOICE_DATA(I)的结果.Status和其他SELECT值都是有效参数(并且包含了它们的用例),并且在存储过程外调用时返回适当的字符串.

语法有什么地方错了吗? 如果可能的话,我想继续使用forall,因为它比常规的for循环快得多.

推荐答案

该错误表示参数值(Status)不是CASE语句中的CASE(0、200、300).

如果您执行此代码select GetInvoiceStatus(555) as dd from dual,您将得到相同的错误.

因此,添加如下所示的Else语句:

create or replace function GetInvoiceStatus(status number)
    return nvarchar2
as
begin
    case status
        when 0 then return 'New';
        when 200 then return 'Sent';
        when 300 then return 'Accepted';
        else return '';
        end case;
end; 

Sql相关问答推荐

在postgresql中使用来自另一个字段的日期名称作为JSONB查询中的关键字

使用交叉应用透视表在SQL中转换分段时间段&

在SQL中创建一个计数器,根据BigQuery/SQL中的条件递归地添加行值

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

LEFT JOIN不显示计数0我期望的方式

对非RUST源代码字符串使用`stringify!`,例如SQL查询

使用多个嵌套数组查询JSON数据

根据时间、状态和相关行在PostgreSQL中的存在来删除行

通过对象分离实现原子性

Postgresql 生成器列导致语法错误

插入行时的行安全策略问题

检索具有相同位置的最小和最大store 数量

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

String_Split 多列

为数组中的每个元素从表中收集最大整数

运算符不存在:integer = bigint[]

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

CURRENT_ROW 窗口框架上的 SQL 滞后

在sql server中创建唯一标识符列

为什么这是 AND,OR with NULL 的真值表?