私はいくつかの助けを得て、このページとこの説明に導かれました。これには、物事を集約する効率的な方法が含まれているはずです.
deCOLLECT
関数やその他のカスタムのものを使用することをお勧めします。私はうまくやろうとしていますが、エラーメッセージ (および私の初心者) は最も役に立ちません。
関数:
CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000);
CREATE OR REPLACE FUNCTION tab_to_string (
p_varchar2_tab IN t_varchar2_tab,
p_delimiter IN VARCHAR2 DEFAULT ',')
RETURN VARCHAR2 IS
l_string VARCHAR2(32767);
BEGIN
FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
IF i != p_varchar2_tab.FIRST THEN
l_string := l_string || p_delimiter;
END IF;
l_string := l_string || p_varchar2_tab(i);
END LOOP;
RETURN l_string;
END tab_to_string;
そして私のテスト:
with my_table as
(
select 'user1' as usrid, 'ab' as prodcode from dual union
select 'user1' as usrid, 'bb' as prodcode from dual union
select 'user1' as usrid, 'a' as prodcode from dual union
select 'user2' as usrid, 'db' as prodcode from dual union
select 'user2' as usrid, 'b' as prodcode from dual union
select 'user2' as usrid, 'bfdd' as prodcode from dual
)
select
usrid,
tab_to_string(CAST(COLLECT(prodcode) AS t_varchar2_tab)) AS codes
from
my_table
group by
usrid
私に与えるだろうORA-06553: PLS-306: wrong number or types of arguments in call to 'TAB_TO_STRING'
これは、最初に言及したソースからのほとんどのコピー アンド ペーストであり、機能は私にとって理にかなっています..何が欠けているのでしょうか?
ありがとう!
[編集] Codo は、問題の 1 つは Oracleがvarcharではなくchar'a'
として理解していたことにあると考えました。これにより、問題が実際の問題になりました。集中したので更新しました。