【问题标题】:IN operator different type of argumentsIN 运算符不同类型的参数
【发布时间】:2015-03-27 18:05:48
【问题描述】:

我有这张桌子:

CREATE TABLE TEST
(
  DEP_CODIGO_UNIDAD            NUMBER(4),
  XPTO                         NUMBER(4)
)

我想在 pl 上做一个函数:

select * from TEST where DEP_CODE in (4102, 3201, 8540,...,2010)

这可以使用 SQL,但作为 PL 函数,我收到 ora-01722 无效数字

我的函数如下所示:

FUNCTION REL_TEST(vCeco                 IN VARCHAR2,
                errorCode             OUT NUMBER) RETURN CURSOR IS
OPEN CURSOR (bla bla) ...
for
select * from TEST where DEP_CODE in (vCeco)

有什么想法吗?顺便说一句,我使用的是 Oracle 11g。

【问题讨论】:

  • 你不能那样做。见这里 - asktom.oracle.com/pls/apex/…
  • 您的vCeco 字符串是如何生成的,从哪里生成的?有一些方法可以将字符串解压成值(不一定很漂亮;this question 目前处于活动状态),但您也可以传递一组数字,这样会更容易。
  • Alex,我尝试在 pl sql 中测试,将普通字符串传递到测试窗口,即 4102、3201、8540。我还尝试添加逗号 '4102'、'3201'、'8540' 但是得到同样的错误。

标签: sql oracle


【解决方案1】:

当你这样做时:

select * from TEST where DEP_CODE in (vCeco)

而你的变量 vCeco 是一个字符串,例如值4102, 3201, 8540,它就像你写的一样:

select * from TEST where DEP_CODE in ('4102, 3201, 8540')

(只是字符串在绑定变量中。)

然后尝试将字符串值 '4102, 3201, 8540' 隐式转换为 one 数字,因为逗号是 value 的一部分,所以它不能这样做,因此引发异常。

创建动态IN 列表有很多选择。您可以在此处找到一系列方法:

http://oracle-base.com/articles/misc/dynamic-in-lists.php

选择最适合您设置的解决方案。

【讨论】:

  • 感谢您的回答,但我很抱歉......我看不出这些解决方案如何帮助我......对不起,我是个白痴。我也尝试了 Michael Broughton 的建议,但没有奏效。无论如何,我无法理解这如何在 SQL 上工作,但在 PL/SQL FUNCTION 上却不行......
  • 在 SQL 中,逗号分隔的列表是语句的一部分,并作为语句的一部分进行解析。您在 PL/SQL 函数中所做的与您在 SQL 中所做的 select * from TEST where DEP_CODE in (:bindvariable) 相同。这也会因同样的错误而失败。您的逗号分隔列表是 one 字符串值,逗号是字符串的一部分,而不是语句的一部分。如果它不能那样工作,那么就不可能在字符串中包含逗号的数据中搜索字符串值。您需要使用不同的方法,您正在做的事情是不可能的。
【解决方案2】:

如果您要向自己发送以逗号分隔的值列表,不妨试试动态 sql? (我也会对也有 OUT 参数的函数提出异议,但这是另一个风格点)

FUNCTION rel_test( v_ceco  IN VARCHAR2
                   ,errorCode OUT NUMBER)
RETURN sys_refcursor
IS
   l_cursor sys_refcursor;
BEGIN
   OPEN l_cursor for 'SELECT * from TEST where dep_Code in ('||v_ceco||')';
   RETURN l_Cursor;
END;

【讨论】:

  • 这会打开 SQL 注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2015-01-30
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多