質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

105閲覧

SQLの結合とパッケージ引数の渡し方

vestrade

総合スコア9

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2025/01/17 07:15

編集2025/01/17 07:22

実現したいこと

OracleDBにてパッケージを利用しているのですが、パッケージへの引数の渡し方ないし結合方法を教えていただきたい

発生している問題・分からないこと

以下のFROM句があるのですが、パッケージに渡す引数をTABLE (USER_PKG.GET_USERINFO(ORDER_DETAIL.DEMAND_USER_CD, DEMAND_DETAIL.GEN_DEMAND_DATE))としたいです。
結合が入れ子になるとわからなくなってしまい、どのように実現すればよいかご助力いただけないでしょうか。

該当のソースコード

SQL

1FROM 2 ORDER_HD T1 3 INNER JOIN ORDER_DETAIL T2 4 ON T1.ORDER_TYPE = T2.ORDER_TYPE 5 AND T1.ORDER_YEAR = T2.ORDER_YEAR 6 AND T1.ORDER_NO = T2.ORDER_NO 7 LEFT JOIN ( 8 SELECT 9 * 10 FROM 11 TABLE (USER_PKG.GET_USERINFO(NULL, NULL)) 12 ) T3 13 ON T2.DEMAND_USER_CD = T3.USER_CD

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

SQL

1FROM 2 ORDER_HD T1 3 INNER JOIN ORDER_DETAIL T2 4 ON T1.ORDER_TYPE = T2.ORDER_TYPE 5 AND T1.ORDER_YEAR = T2.ORDER_YEAR 6 AND T1.ORDER_NO = T2.ORDER_NO 7 LEFT JOIN ( 8 SELECT 9 * 10 FROM 11 TABLE (USER_PKG.GET_USERINFO(D.DEMAND_USER_CD, DD.GEN_DEMAND_DATE)) 12 FROM 13 ORDER_DETAIL D 14 JOIN DEMAND_DETAIL DD 15 ON D.GEN_DEMAND_ORDER_NO = DD.GEN_DEMAND_ORDER_NO 16 ) T3 17 ON T2.DEMAND_USER_CD = T3.USER_CD

SQL

1FROM 2 ORDER_HD T1 3 INNER JOIN ORDER_DETAIL T2 4 ON T1.ORDER_TYPE = T2.ORDER_TYPE 5 AND T1.ORDER_YEAR = T2.ORDER_YEAR 6 AND T1.ORDER_NO = T2.ORDER_NO 7 LEFT JOIN ( 8 SELECT 9 * 10 FROM 11 TABLE (USER_PKG.GET_USERINFO(D.DEMAND_USER_CD, DD.GEN_DEMAND_DATE)) T3 12 FROM 13 ORDER_DETAIL D 14 JOIN DEMAND_DETAIL DD 15 ON D.GEN_DEMAND_ORDER_NO = DD.GEN_DEMAND_ORDER_NO 16 ) T3 17 ON T2.DEMAND_USER_CD = T3.USER_CD

上記のようなコードを試したのですが、カッコが足りない構文エラー(箇所がわからない)や引数がうまく渡せていないようでした。

よろしくお願いします。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2025/01/18 02:14

USER_PKG.GET_USERINFO()のパラメータの型はなんですか? selectの結果をパラメータとして渡したい時は、TABLE OFとなるパラメータの型が必要です。
vestrade

2025/01/18 03:55

失礼しました。 USER_PKG.GET_USERINFO(CHAR,DATE)になります。
sazi

2025/01/18 05:04 編集

因みにですが、ORDER_DETAIL とORDER_HD に関係性はありますか? それから、USER_PKG.GET_USERINFO()はテーブル型を返却するのですよね? USER_PKGがユーザー定義のパッケージなら、使い方とか提供されてないんでしょうか? 既存の型がありそうだし。
guest

回答1

0

推測ですけど以下の様な記述になるのではないかと思います。

SQL

1--#以下はパラメータの型定義ですが、既存の型があるならそれを利用 2CREATE OR REPLACE TYPE typ_para_GET_USERINFO force IS OBJECT (--パラメータ 3 p1 char(255) 4, p2 date 5); 6CREATE OR REPLACE TYPE ptyp_GET_USERINFO AS TABLE OF typ_para_GET_USERINFO 7;

SQL

1select 2 usr.* 3FROM 4 ORDER_HD T1 5 INNER JOIN ORDER_DETAIL T2 6 ON T1.ORDER_TYPE = T2.ORDER_TYPE 7 AND T1.ORDER_YEAR = T2.ORDER_YEAR 8 AND T1.ORDER_NO = T2.ORDER_NO 9 left join ORDER_DETAIL D 10 ON T2.DEMAND_USER_CD = D.USER_CD 11 left JOIN DEMAND_DETAIL DD 12 ON D.GEN_DEMAND_ORDER_NO = DD.GEN_DEMAND_ORDER_NO 13 , lateral( 14 select * 15 from table(USER_PKG.GET_USERINFO( 16 CAST(ptyp_GET_USERINFO(T2.DEMAND_USER_CD, DD.GEN_DEMAND_DATE) AS ptyp_GET_USERINFO) 17 )); 18 ) usr

投稿2025/01/18 05:59

sazi

総合スコア25331

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問