入力値を渡すのを手伝ってもらえますか(実行時には、一度に1つの変数に対して複数の値を入力することを意味します)。PLSQLの単一変数への入力として一度に複数の値を読み取る方法はありますか?
ここでは、ハードコードされた入力または1つの入力を同時に入力するコードを示します。
declare
type TEmpRec is record (
EmployeeID EMPLOYEES.EMPLOYEE_ID%TYPE,
LastName EMPLOYEES.LAST_NAME%TYPE
);
type TEmpList is table of TEmpRec;
vEmpList TEmpList;
---------
function EmpRec(pEmployeeID EMPLOYEES.EMPLOYEE_ID%TYPE,
pLastName EMPLOYEES.LAST_NAME%TYPE default null) return TEmpRec is
-- Effective "Record constructor"
vResult TEmpRec;
begin
vResult.EmployeeID := pEmployeeID;
vResult.LastName := pLastName;
return vResult;
end;
---------
procedure SearchRecs(pEmpList in out nocopy TEmpList) is -- Nocopy is a hint to pass by reference (pointer, so small) rather than value (actual contents, so big)
vIndex PLS_integer;
begin
if pEmpList is not null then
vIndex := pEmpList.First;
while vIndex is not null -- The "while" approach can be used on sparse collections (where items have been deleted)
loop
begin
select LAST_NAME
into pEmpList(vIndex).LastName
from EMPLOYEES
where EMPLOYEE_ID = pEmpList(vIndex).EmployeeID;
exception
when NO_DATA_FOUND then
pEmpList(vIndex).LastName := 'F'||pEmpList(vIndex).EmployeeID;
end;
vIndex := pEmpList.Next(vIndex);
end loop;
end if;
end;
---------
procedure OutputRecs(pEmpList TEmpList) is
vIndex PLS_integer;
begin
if pEmpList is not null then
vIndex := pEmpList.First;
while vIndex is not null
loop
DBMS_OUTPUT.PUT_LINE ('pEmpList(' || vIndex ||') = '|| pEmpList(vIndex).EmployeeID||', '|| pEmpList(vIndex).LastName);
vIndex := pEmpList.Next(vIndex);
end loop;
end if;
end;
begin
vEmpList := TEmpList(EmpRec(100),
EmpRec(34),
EmpRec(104),
EmpRec(110));
SearchRecs(vEmpList);
OutputRecs(vEmpList);
end;
/
上記のプログラムは、入力値を1つずつ取ります。 しかし、私は以下のように試みたが、成功することができませんでした。
私は、入力をハードコーディングする代わりに(100,34,104,100)一度にコンソールからの入力を与えようとしました。 DECLAREセクションの
スニペット:DECLAREセクションの
BEGIN
FOR j IN v_input.FIRST .. v_input.LAST LOOP
vEmpList := TEmpList(EmpRec(v_input(j).EmployeeID)); --to assign input values to vEmptList
SearchRecs(vEmpList);
OutputRecs(vEmpList);
end loop;
end;
/
エラー: PLS-00306:間違った数またはタイプの最終BEGINセクションで
declare
type TEmpRec is record (
EmployeeID EMPLOYEES.EMPLOYEE_ID%TYPE,
LastName EMPLOYEES.LAST_NAME%TYPE
);
type TEmpList is table of TEmpRec;
v_input TEmpList := TEmpList(&v_input); -- to read multiple input at once
vEmpList TEmpList;
'TEMPLIST'の呼び出しでの引数 LAST BEGIN seのエラーction: PLS-00320:この式の型の宣言は、一例として
不完全または不正な形式れる:時、iは同じ変数のための複数の入力値を読み取ることができが、私が通過することができませんこれは入力として、しかし、これを入力として私のメインプログラムにする方法を理解することができません。
DECLARE
TYPE t IS TABLE OF VARCHAR2(100);
ORDERS t := t(&ORDERS);
BEGIN
FOR j IN ORDERS.FIRST .. ORDERS.LAST LOOP
dbms_output.put_line(ORDERS(j));
END LOOP;
END;
/
出力: PL/SQLプロシージャが正常に完了しました。 はオーダーの値を入力します:321153678
はありがとうございました。
'TEmpRec'はプレーンなPL/SQLレコードタイプなので、コンストラクタはありません。コンストラクタが必要な場合は、オブジェクト型を作成する必要があります。より詳細な回答が必要な場合は、[mcve](https://stackoverflow.com/help/mcve)を使用すると問題がより明確になります。 –