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

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

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

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

解決済

2回答

1774閲覧

Oracleのパッケージへのプロシージャ追加について

sachito

総合スコア13

Oracle

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2018/06/03 08:51

編集2018/06/03 13:39

既存のパッケージに新しいプロシージャを追加したいです。
以下のように作成済みのパッケージがあります。

CREATE OR REPLACE PACKAGE TEST_PACK AS --プロシージャの定義 procedure Test2(p1 in varchar2, p2 in out varchar2); END; / CREATE OR REPLACE PACKAGE BODY TEST_PACK AS --プロシージャの実装 procedure Test2(p1 in varchar2, p2 in out varchar2) is begin dbms_output.put_line('para1 = ' || p1); dbms_output.put_line('para1 = ' || p2); p2 := p1 || p2; end; END TEST_PACK; /

このTEST_PACKパッケージに新しいプロシージャを追加するにはどのようにすれば良いでしょうか?
ご教示お願いします。

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

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

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

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

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

Orlofsky

2018/06/03 13:31

PL/SQL タグを追加してください。
sachito

2018/06/03 13:37

タグを追加しました。
guest

回答2

0

ベストアンサー

オラクル ちょこっとリファレンス PACKAGE編 PACKAGEとPACKAGE BODY が必要です。
差支えない範囲で現行のコードを載せると解決が早いです。
社内にPL/SQLの熟練者がいなければ短期間でも熟練者を雇うなり、有償研修に行かれることをお勧めします。

去年もPL/SQLのブロック(スコープルール)を理解していない、例外もわかっていない、データベースのトランザクション(これはSQLレベル)もわかっていない、etc. って詐欺に会ったようなコードを見ました。
損害賠償請求ものですよ、こんなプログラムで納品を認める方も悪いです。


追記

PL/SQL

1CREATE OR REPLACE PACKAGE TEST_PACK AS 2 3 --プロシージャの定義 4 procedure Test2(p1 in varchar2, p2 in out varchar2); 5 6 procedure Test3(...); -- PROCEDUREを追加 7 8END; 9/ 10 11CREATE OR REPLACE PACKAGE BODY TEST_PACK AS 12 13 --プロシージャの実装 14 procedure Test2(p1 in varchar2, p2 in out varchar2) is 15 begin 16 dbms_output.put_line('para1 = ' || p1); 17 dbms_output.put_line('para1 = ' || p2); 18 p2 := p1 || p2; 19 end Test2; 20 21 procedure Test3(...) is -- PROCEDUREを追加 22 begin 23 ... 24 end Test3; 25 26END TEST_PACK; 27/

投稿2018/06/03 13:27

編集2018/06/03 13:55
Orlofsky

総合スコア16415

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

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

sachito

2018/06/03 13:41

質問の意図が伝わりにくい文章でしたので修正しました。 既存のパッケージは問題なく動作していて、そこに新しいプロシージャを追加するときには どうすれば良いか、という質問になります。 元のパッケージ定義に新規分を追記したものを「CREATE OR REPLACE PACKAGE」で再定義するしかないのでしょうか?
Orlofsky

2018/06/03 13:55

「CREATE OR REPLACE PACKAGE」で再定義、ってのがわかりません。 とりあえず、回答に追記しました。
sachito

2018/06/03 14:33

追記ありがとうございます。回答頂いているように、Test3プロシージャを追加するためにTEST_PACKを再定義(Test2プロシージャをもう一度記載)する必要があるんですね。 既存のTEST_PACKパッケージに何が入っているか分からないけれど、そこにTest3プロシージャを含めたく、その方法があるか質問していました。 (実際には何が入っているかわかっていますが、無駄な再定義を避けたい意図です。) やはりありませんか?
Orlofsky

2018/06/03 14:58

再定義、って言い方はしないですが、 https://www.shift-the-oracle.com/plsql/dbms_metadata/ でDDL (今回はCREATE PACKAGE文)をテキストファイルとして取得します。エディタでPACKAGEとPACKAGE BODY に PROCEDUREを追記してsqplus からスクリプトを実行(@file_name full pass)します。
sachito

2018/06/04 00:54

そうでしたか、リンクありがとうございます。 最後まで回答頂けましたのでベストアンサーとします。
guest

0

質問の内容についてセミコロンの位置がおかしくないですか?
参考にしたものが正しくないんでしょう。

正規のリファレンスを参照された方がいいですよ。

以下は参考程度で。
Oracle PL/SQL 編6 - ストアドパッケージ package 、データベーストリガー

質問については、具体的なコードとエラー内容で質問された方が、的確な回答が得られやすいです。

追記

PACKEGEですから、内部の情報を個別に追加や削除はできません。
変更としては、ALTER PACKAGEですが、部分的な変更はできません。

パッケージ中のすべてのオブジェクトは、1つの単位として格納されているため、ALTER PACKAGE文によって、すべてのパッケージ・オブジェクトがまとめて再コンパイルされます。ALTER PROCEDURE文またはALTER FUNCTION文を使用して、パッケージ中の一部のプロシージャまたはファンクションを再コンパイルすることはできません。

既存に影響を与えたくないなら、スタンドアロンのストアドでの登録が必要になります。

投稿2018/06/03 09:49

編集2018/06/03 15:12
sazi

総合スコア25173

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

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

sachito

2018/06/03 13:39

ありがとうございます。リンク参考にしました。
sachito

2018/06/04 00:55

追記ありがとうございます。個別に追加、削除できない旨理解しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問