declare
type t_trayIds is table of number(38,0) index by binary_integer;
v_trayIdsTable t_trayIds;
create or replace function F_getTrayIdByDiameter(v_diameterInCm tray.diameterincm%TYPE)
return t_trayIds
as
v_trayIdsTable t_trayIds := null;
begin
select t.trayid into v_trayIds from tray t
where t.diameterincm = v_diameterincm;
return v_trayIdsTable;
end;
したがって、私が欲しいのは、特定の直径を持つすべてのトレイIDを要求し、それらを配列またはテーブルに格納することです。JavaではArrayListを使用しました。最後にテーブルを返して、結果を別の関数に渡したいと思います。上記のコードは機能していないようです。SQL Developerは、単語で構文エラーを出しますcreate
。誰かが助けることができますか?
開始セクションが後に続く必要がある宣言セクションと、オブジェクトを作成するためのスタンドアロンステートメントである「作成または置換関数」を混在させているため、コードは失敗します。
PL / SQL表型を宣言して公開する場合は、パッケージ仕様に含める必要があります。これにより、任意の関数で表示できるようになります(ここでは、関数F_getTrayIdByDiameterも宣言して表示します)。
CREATE OR REPLACE package utils is
type t_trayIds is table of number(38,0) index by binary_integer;
function F_getTrayIdByDiameter(v_diameterInCm tray.diameterincm%TYPE) return t_trayIds;
end utils;
/
また、SELECTINTO構文を使用することはできません。
colをvarに選択
リストではなく、単一行にのみ使用できます。PL / SQLでは、複数の行を管理する場合は、カーソルを使用する必要があります。したがって、PL / SQL表を作成する場合は、カーソルをフェッチしてリスト(PL / SQL表)を作成できます。だから、あなたのパッケージ本体は、
CREATE OR REPLACE package body utils is
function F_getTrayIdByDiameter(v_diameterInCm tray.diameterincm%TYPE) return t_trayIds is
v_trayIdsTable t_trayIds;
i number := 0;
cursor c is
select t.trayid from tray t
where t.diameterincm = v_diameterincm;
begin
for my_rec in c loop
v_trayIdsTable(i) := my_rec.trayid;
i := i + 1;
end loop;
return v_trayIdsTable;
end;
end utils;
/
次に、リストを別の関数または匿名ブロックで使用できます。たとえば、次のようになります。
declare
my_result utils.t_trayIds;
begin
my_result := utils.F_GETTRAYIDBYDIAMETER(20);
dbms_output.put_line(my_result(0));
end;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加