试图将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;
,但它依赖于呼叫者能够将数字传递而不是字符串(请注意缺乏单引号...(