كيفية إرجاع نتيجة ديناميكية في وظيفة Oracle
سؤال
لقد عثرت على استعلام رمزي على الشبكة وعملته في الوظيفة أدناه ، والتي تُرجع المجموعة الديناميكية من الرموز. تجمع الوظيفة بنجاح ولكن بطريقة ما أحصل على الخطأ "ORA-00933: أمر SQL لم ينته بشكل صحيح". هل يمكن لأحد أن يساعدني في تصحيح هذا؟ شكرًا لك.
CREATE OR REPLACE TYPE KEY_VALUE_TYPE is object (k varchar2(4000), v varchar2(4000));
CREATE OR REPLACE TYPE KEY_VALUE_TABLE is table of key_value_type;
CREATE OR REPLACE FUNCTION StrTokenizer
(string IN VARCHAR2, delimiter IN VARCHAR2)
RETURN key_value_table AS
v_ret key_value_table;
BEGIN
SELECT
CAST(
multiset(
SELECT
LEVEL k,
SUBSTR(STRING_TO_TOKENIZE,
DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1),
INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)
- DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)) v
FROM
(
SELECT
':string'||':delimiter' AS STRING_TO_TOKENIZE , ':delimiter' AS DELIMITER
FROM
DUAL
)
CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)>0
ORDER BY level ASC)
As key_value_table)
INTO
v_ret
FROM dual;
return v_ret;
END;
select * from strtokenizer('a,b,c',',')
ORA-00933: SQL command not properly ended
يحرر:
select * from table(strtokenizer('a,b,c',','))
يعطي "ORA-30732: لا يحتوي الجدول على أي أعمدة مرئية للمستخدم".ORA-30732
لقد ولت عندما قمت بتسجيل الدخول كمالك الوظيفة ، لكن الوظيفة لا يمكن استبدالها ": السلسلة" || ": محدد" مع القيم التي تم تمريرها. كيف يمكنني تصحيح هذا؟ وكيف يمكنني تشغيل وظيفة عندما لا يتم تسجيل الدخول كمالكها؟ شكرًا لك.
المحلول
على افتراض أن الوظيفة تجمع ، حاول:
SELECT *
FROM TABLE(strtokenizer('a,b,c',','));
المرجعي:
يجب تصحيح الوظيفة - استخدام:
CREATE OR REPLACE FUNCTION StrTokenizer (string IN VARCHAR2,
delimiter IN VARCHAR2)
RETURN key_value_table AS v_ret key_value_table
BEGIN
SELECT CAST(MULTISET(SELECT LEVEL k,
SUBSTR(STRING_TO_TOKENIZE, DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1),
INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) - DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)) v
FROM (SELECT string || delimiter AS STRING_TO_TOKENIZE ,
delimiter AS DELIMITER
FROM DUAL)
CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)>0
ORDER BY level ASC) AS key_value_table)
INTO v_ret
FROM DUAL;
RETURN v_ret;
END;
لا تنتمي إلى StackOverflow