0

我有这样的程序...

declare
v_psg varchar2(10);
id_no number;

begin

select value into v_psg from settings_am where key = 'PSG';
select id into id_no from product where to_char(psg) in (v_psg);
end;`

从返回的值select value into v_psg from settings_am where key = 'PSG';将是

'1','2','3'

当我运行这个程序时,我返回了 ora 错误 - ORA-01403。

请告知我应该如何将 v_psg 值传递给产品表的 psg 列?

编辑 - 尝试使用建议的测试用例

4

1 回答 1

1

如果你得到了ORA-01403,你有点幸运。这是NO_DATA_FOUND错误,这意味着一个(可能是第一个)查询没有返回任何内容。

这两个语句可以合并为

select id 
from product
where to_char(psg) in (select value 
                       from settings_am 
                       where key = 'PSG'
                      );

为什么value要先选择,然后在另一个查询中使用它?此外,它只是行不通。v_psg被声明为VARCHAR2变量。您描述它的方式,它包含以下字符串:'1','2','3',好像这就是您所拥有的:

SQL> create table settings_am (key  varchar2(10),
  2                            value varchar2(20));    --> note size here

Table created.

SQL> insert into settings_am (key, value)
  2    values ('PSG', q'['1','2','3']');

1 row created.

SQL> select * From settings_am;

KEY        VALUE
---------- --------------------
PSG        '1','2','3'

SQL>

如您所见,我扩大了value列大小,尽管您声明的变量说10. 为什么?因为

SQL> select length(value) from settings_am where key = 'PSG';

LENGTH(VALUE)
-------------
           11

即,您不能将 long 11的内容放入接受 length 10的内容中。

或者,如果您的数据实际上包含 3 行作为PSG键,这些值是否已经包含在单引号中?如果是这样,那就奇怪了;人们通常不会那样做。无论如何,假设您设法将字符串'1,2,3'(这是我假设您实际拥有的)放入VARCHAR2变量中,那么您必须将其拆分为行以便能够在IN子句中使用它:

SQL> create table product (id number, psg varchar2(10));

Table created.

SQL> insert into product (id, psg) values (100, '1');

1 row created.

SQL> insert into product (id, psg) values (200, '2');

1 row created.

SQL>

然后是查询(其中第 3 - 5 行表示将字符串拆分为行):

SQL> select p.id
  2  from product p
  3  where p.psg in (select regexp_substr('&&v_psg', '[^,]+', 1, level)
  4                  from dual
  5                  connect by level <= regexp_count('&&v_psg', ',') + 1
  6                 );
Enter value for v_psg: 1,2,3

        ID
----------
       100
       200

那么,使用起来不是更简单吗

SQL> select id
  2  from product
  3  where to_char(psg) in (select value
  4                         from settings_am
  5                         where key = 'PSG'
  6                        );

        ID
----------
       100
       200

SQL>

请注意,这两个选项还显示了查询错误的原因:您不能将两个值(行)放入声明为错误的变量id_no number;TOO_MANY_ROWS


最后,你想做什么?你想解决什么问题?显然,除了特殊情况(每个值只有一行)之外,您的查询无法正常工作。如果您可以提供测试用例(创建表并插入示例数据)以及预期的输出,那么帮助您会更容易。

于 2019-06-30T09:20:50.720 回答