SELECT中返回VARCHAR的功能



试图将SQL概括为将字符串/varchar分配到记录中。这是工作SQL:

SELECT test.* FROM test JOIN (
SELECT level nbr, REGEXP_SUBSTR('1,3', '(.*?)(,|$)', 1, level, NULL, 1) value
FROM dual CONNECT BY level <= REGEXP_COUNT('1,3', ',')+1 ORDER BY level
) requested ON test.id=requested.value

我通过概括的意思是;将重复出现的SQL(在这种情况下,括号中的位从上方的工作SQL之间的位(转移到过程/函数,以便可以重复使用。在这种情况下,我试图找到一种插入生成的内部选择语句的方法。这就是广义SQL的外观:

SELECT t.* FROM table t JOIN (<GENERATED_INNER_SELECT>) my ON t.x=my.x;

但是我还没有成功,我尝试了tho,但请致电我的功能以生成内部选择语句直接导致:

ORA-00900:无效的SQL语句

并在广义SQL中使用该函数导致:

ora-00907:缺少右括号

在这种情况下,这些错误对我没有任何意义。

也许您可以提供帮助?在DBFIDDLE上查看完整案例。

如果生成一个用于用作子查询的SQL片段,则嵌入为子查询的总体语句也必须动态执行。

使函数实际执行拆分本身并返回集合会更简单 - 作为模式级集合类型:

CREATE TYPE T_NUMBERS AS TABLE OF NUMBER
/
CREATE OR REPLACE FUNCTION split(p_string VARCHAR2, p_seperator VARCHAR2 DEFAULT ',')
    RETURN T_NUMBERS AS
    L_NUMBERS T_NUMBERS;
BEGIN
    SELECT REGEXP_SUBSTR(p_string, '(.*?)(,|$)', 1, level, NULL, 1)
    BULK COLLECT INTO L_NUMBERS
    FROM dual
    CONNECT BY level <= REGEXP_COUNT(p_string, ',')+1;
    RETURN L_NUMBERS;
END split;
/
SELECT * FROM TEST
WHERE id MEMBER OF (split('1,3'))
/
        ID NAM
---------- ---
         1 foo
         3 foe

,或者如果您喜欢表收集表达方法:

SELECT t.*
FROM TABLE(split('1,3')) tmp
JOIN test t ON t.id = tmp.column_value;

首先可以通过数字集来调用查询会更简单,但是没有看到呼叫是如何进行的 - 和弦的生成 - 很难确切地说出您需要如何需要改变。然后,您甚至可以使用内置的集合类型,而不必定义自己的收藏类型:

SELECT t.*
FROM TABLE(SYS.ODCINUMBERLIST(1,3)) tmp
JOIN test t ON t.id = tmp.column_value;

,但它依赖于呼叫者能够将数字传递而不是字符串(请注意缺乏单引号...(

最新更新