でレコード表を移入するために、私は木を記述した行を持つテーブルがあるが、次のとおりです。 (列child_num
が固有で主キーとして使用)、列はどのように2つのレベルの列親子
TABLE items_tree (
child_num number,
parent_ref varchar2(10),
child_ref varchar2(10)
);
TYPE item_rec_type IS RECORD (
item_id NUMBER,
spaces_number NUMBER,
parent_ref VARCHAR2(10),
child_ref VARCHAR2(10)
);
TYPE tree_table_type IS TABLE OF item_rec_type%ROWTYPE
INDEX BY BINARY_INTEGER;
table_tree tree_table_type; -- table of all items
テーブル
items_tree
ため
例データ(child_num
の値は関係ありません):
parent_ref child_ref
---------------------------
null Abraham
Abraham Isaac
Abraham Ishmael
Isaac Jakob
Jakob Yehuda
Jakob Josef
Jakob Benjamin
Yehuda David
Josef Efraim
Josef Menashe
David Solomon
Solomon Isaiah
Isaiah Jeremiah
私はを移入する必要がありますrecords from items_tree
テーブル。これを行うには、item_rec_type
,tree_table_type
,table_tree
というパッケージが定義されており、2つの手順:は、ROOT
のツリーの項目を取得し、処理を開始し、table_tree
からツリーを印刷します。第2の手順get_items_by_parent_recursively
は、すべてのアイテムまたは親アイテムを検索する再帰的プロシージャである。 get_items_by_parent_recursively('Abraham')
を呼び出すと、IsaacとIshmael〜table_tree
が追加されます。
カーソルは、パッケージ本体で宣言されています。親のためのアイテムを取得しget_items_by_parent_recursively
で
CURSOR get_children_cur(c_parent in varchar2(10))
IS
SELECT parent_ref, child_ref
FROM items_tree
WHERE parent_ref = c_parent
ORDER BY 1, 2;
コード:CURSOR_ALREADY_OPEN
:
procedure get_items_by_parent_recursively(p_parent in VARCHAR2(10), p_spaces_number in NUMBER)
AS
l_spaces_number NUMBER := 0;
l_child VHARCHAR2(10);
l_parent VHARCHAR2(10);
BEGIN
l_spaces_number := p_spaces_number + 3;
OPEN get_children_cur(p_parent);
LOOP
FETCH get_children_cur INTO l_parent, l_child;
EXIT WHEN get_children_cur%NOTFOUND;
IF (l_child is not null) THEN
v_row_number := v_row_number + 1;
tree_table(v_row_number).row_num := v_row_number;
tree_table(v_row_number).spaces_number := l_spaces_number;
tree_table(v_row_number).parent_ref := l_parent;
tree_table(v_row_number).child_ref := l_child;
-- Calling procedure recursively
get_items_by_parent_recursively(l_child, l_spaces_number);
END IF;
END LOOP;
CLOSE get_children_cur;
EXCEPTION
WHEN CURSOR_ALREADY_OPEN THEN
DBMS_OUTPUT.put_line(' Exception -- CURSOR_ALREADY_OPEN');
WHEN INVALID_CURSOR THEN
DBMS_OUTPUT.put_line(' Exception -- INVALID_CURSOR');
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.put_line(' Exception -- INVALID_NUMBER');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line(' Exception -- NO_DATA_FOUND');
WHEN PROGRAM_ERROR THEN
DBMS_OUTPUT.put_line(' Exception -- PROGRAM_ERROR');
WHEN ROWTYPE_MISMATCH THEN
DBMS_OUTPUT.put_line(' Exception -- ROWTYPE_MISMATCH');
WHEN STORAGE_ERROR THEN
DBMS_OUTPUT.put_line(' Exception -- STORAGE_ERROR');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.put_line(' Exception -- TOO_MANY_ROWS');
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.put_line(' Exception -- VALUE_ERROR');
END get_items_by_parent_recursively;
私は例外を取得しています。
私は返信を検索しましたが、私が必要とするものに近いものはありませんでした。私はどんな考えにも感謝します。
私はカーソルを再帰的手順の一部にすることを試みます。get_children_cur
私はカーソルが手続き本体内で宣言される必要があると思いますが、宣言は表示されません。あなたはそれを試しましたか? – vmachan
カーソルを表示しないだけでなく、あなたのコードはさまざまな方法で無効です(仮パラメータ定義のサイズ、一貫性のない名前とデータ型、プロシージャ名が長すぎても、 'vharchar'のスペルミス)。 [完全で実用的な例](http://stackoverflow.com/help/mcve)は、期待される出力と同様に、はるかに役立ちます。これにはPL/SQLが本当に必要ですか?階層的な問合せや再帰的なCTEで実行できるもののようですが、どの出力を必要とするかによって異なります... –
表示されたカーソルも無効です。カラム名があなたのテーブル定義と一致せず、パラメータサイズを再び制限しました。どこから 'p_child'が来るのですか?そして、プロシージャのオープンカーソル呼び出しから来る 'p_parent'は' l; _parent'、あるいは 'l_child'でしょうか?私はあなたが何をしようとしているのか、それについて何かを書くことを推測することができます。しかし、PL/SQLをまったく使用していないのはなぜですか? –