3

私はいくつかの助けを得て、このページこの説明に導かれました。これには、物事を集約する効率的な方法が含まれているはずです.

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'として理解していたことにあると考えました。これにより、問題が実際の問題になりました。集中したので更新しました。

4

1 に答える 1

2

理由はよくわかりませんが、Oracle はPRODCODE合成テーブルの列が VARCHAR2 列ではないと考えています。値の 1 つをわずかに変更するとPRODCODE、機能します。

with my_table as
(
    select 'user1' as usrid, 'ab' as prodcode from dual union
    select 'user1' as usrid, 'b' as prodcode from dual union
    select 'user1' as usrid, 'c' as prodcode from dual union
    select 'user2' as usrid, 'd' as prodcode from dual union
    select 'user2' as usrid, 'e' as prodcode from dual union
    select 'user2' as usrid, 'f' as prodcode from dual
)
select
    usrid, 
    tab_to_string(CAST(COLLECT(prodcode) AS t_varchar2_tab)) AS codes
from
    my_table
group by
    usrid
于 2011-09-26T11:29:46.110 に答える