プロシージャから特定の列の値を戻す最適な方法は何ですか。私はSELECT *
を使用している場合たとえば、以下のコードは、私がこれを取得するための手順を使用する方法についての運動であると仮定し...それは動作しますが、同じシナリオでOracle PL/SQL:プロシージャから特定の選択した列を戻す
0
A
答えて
2
を
/*DECLARATION*/
TYPE t_data IS TABLE OF Table1%ROWTYPE;
PROCEDURE get_values(data OUT t_data) AS
BEGIN
SELECT a.object_id, a.num, b.descrip
BULK COLLECT INTO data
FROM Table1 a INNER JOIN
Table2 b ON (a.id = b.id)
WHERE a.date IS NULL;
END get_values;
を動作しません。構造化された値のリスト。可能であれば、純粋なSQLメソッドを優先して、テーブルからデータを取得するようなアプローチは決してお勧めしません。
あなたはこれらのようなテーブルを持っているように見える:
create table table1(id ,object_id, num, "date") as (
select 1, 1, 100, sysdate from dual union all
select 2, 2, 200, null from dual
);
create table table2(id, descrip) as (
select 1, 'desc1' from dual union all
select 2, 'desc2' from dual
);
あなたは、各行が、両方のテーブルからの要素が含まれている行のセットを返すプロシージャを作成しようとしています。そのためには、選択したクエリの結果と一致する型を作成する必要があります。
あなたはこのようなあなたのパッケージを定義することもできます。
CREATE OR REPLACE PACKAGE yourPackage AS
TYPE tRec IS RECORD /* made to match the columns you want to extract in your query */
(
object_id NUMBER,
num NUMBER,
descrip VARCHAR2(100)
);
TYPE tTab IS TABLE OF tRec;
PROCEDURE get_values(data OUT tTab);
END yourPackage;
create or replace package body yourPackage as
PROCEDURE get_values(data OUT tTab) AS
BEGIN
SELECT a.object_id, a.num, b.descrip
BULK COLLECT INTO data
FROM Table1 a INNER JOIN
Table2 b ON (a.id = b.id)
WHERE a."date" IS NULL;
END get_values;
end yourPackage ;
あなたは、パッケージにこの方法の手順を呼び出すことができます。
declare
someVar yourPackage.tTab;
begin
yourPackage.get_values(someVar);
--
if someVar.first is not null then
for i in someVar.first .. someVar.last loop
dbms_output.put_line(someVar(i).object_id || ' - ' || someVar(i).num || ' - ' || someVar(i).descrip);
end loop;
end if;
end;
を、これはあなたが得る結果である:
2 - 200 - desc2
+0
優れています。それはまさに私が探していたものでしたありがとう! –
0
Type
のいずれも最初に作成することはできません。table%rowtype
PLSQLブロックobject
という表を作成してから、type of that object
を作成する必要があります。その後、それを使用することができます。
は、以下を参照してください。
CREATE OR REPLACE TYPE Table11 AS OBJECT
(
id NUMBER,
num NUMBER,
description VARCHAR2 (20)
)
CREATE OR REPLACE TYPE t_data IS TABLE OF Table11;
CREATE OR REPLACE PROCEDURE get_values (v_data OUT t_data)
AS
BEGIN
SELECT Table11 (a.row_id, 222, 'hello')
BULK COLLECT INTO v_data
FROM Table1 a INNER JOIN Table2 b
ON (a.row_id = b.appid)
WHERE a.date IS NULL;
END get_values;
を実行:
DECLARE
v_var t_data;
BEGIN
get_values (v_var);
FOR i IN 1 .. v_var.COUNT
LOOP
DBMS_OUTPUT.put_line (v_var (i).id ||' ' ||v_var(i).num ||' ' || v_var(i).description);
END LOOP;
END;
出力:
SQL>/
1 222 hello
2 222 hello
PL/SQL procedure successfully completed.
関連する問題
- 1. PLSQLプロシージャ内のOracleトランザクション
- 2. oracleのplsqlプロシージャ中に表を作成して選択できません
- 3. Oracle PLSQLカーソルネストされた選択ケース
- 4. Oracle SQL:CLOBフィールドから特定の文字列を選択
- 5. Oracle - 参照カーソルから特定の列を選択してください
- 6. 複数の選択したセルから特定の列を選択
- 7. 特定の文字のOracleデータベースPLSQLサブタイプ
- 8. Oracle SQLウィークリー・ランク・プロシージャの選択
- 9. PLSQLプロシージャの終了
- 10. 廃止予定のPLSQLプロシージャ/ファンクションのコード
- 11. アップロードされたデータフレームから特定の列を選択する
- 12. プロシージャの戻り数 - Oracle
- 13. パラメータとしてOracle Plsqlの動的選択
- 14. リンクされたSQL Serverから特定の列を選択
- 15. Oracle PLSQLプロシージャのパラメータの値を確認する方法
- 16. Node.js(csvtojson)excelから特定の列を選択して
- 17. PLSQL DBMS_LOCK.REQUESTおよびAutonoumousプロシージャ
- 18. 選択したリストから特定のオブジェクトを取得する
- 19. プロシージャPLSQLからユーザ定義レコードを取得
- 20. ストアドプロシージャ:選択した行をテーブルから戻し、選択したテーブル行の列を増やす方法
- 21. 選択メニューから特定の行を選択する - PHP/Mysql
- 22. oracle pl/sqlの内部プロシージャから外部プロシージャへのカーソルの戻り
- 23. SQL - テーブル内の特定の列から値を選択する
- 24. データフレームの列から特定の値を選択する
- 25. Django - 2Dリストから特定の行と列を選択する
- 26. テーブルから特定の列を選択するR
- 27. データグリッドからテキストファイルに特定の列を選択する方法
- 28. 特定のセルから列全体を選択するExcel VBA
- 29. listViewから特定のポジションを選択
- 30. IN()句の配列oracle PLSQL
あなたはTABLE1に対応するレコードのテーブルとしてデータを宣言しました。 select文は、table1から2列、table2から1列を選択します。 – DCookie
一般的なSQLで必要なことを行うことができれば、なぜ最初にプロシージャが必要ですか? (私は、非常に頻繁に人々がPL/SQLを使用する必要がないときに使用するので尋ねます) – mathguy