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

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

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

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

SQL

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

Q&A

2回答

2253閲覧

PROCEDUREを使用 2つのテーブル間でカーソルを使用しデータをINSERTしたい

nolyu

総合スコア0

PL/SQL

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

SQL

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

0グッド

0クリップ

投稿2020/06/01 15:06

編集2020/06/02 07:25

前提・実現したいこと

コマンドプロンプトでSQL*Plusを起動し、sqlファイルを実行することでデータベースの操作を行っています。
以下手順の3の添削をお願いします。(1,2は動作確認済)

1 テーブルを作成後、作成テーブルを元に別テーブルを作成
2 作成したテーブルの内、1テーブルにデータをINSERTする
3 データ投入したテーブルからもう片方のテーブルへカーソルを使用し、データをINSERTする
※③ではDECLARE文を使用せず、CREATE OR REPLACE PROCEDURE又はCREATE OR REPLACE FUNCTIONを用いる

発生している問題・エラーメッセージ

3のファイルを実行時、以下のエラーが表示される 警告:プロシージャが作成されましたが、コンパイル・エラーがあります。

該当のソースコード

1 動作確認済 --テーブル1「onetable」を作成 CREATE TABLE onetable ( USER_ID VARCHAR2(10) NOT NULL, USER_NAME VARCHAR2(50), gender_f NUMBER(1,0) ) ; --テーブル1「onetable」を元にテーブル2「twotable」を作成 CREATE TABLE twotable AS SELECT * FROM onetable;
2 動作確認済 --②作成したテーブルの内、1テーブルにデータ投入(INSERT)したSQLファイルを作成 --テーブル1(onetable)にデータを投入する INSERT INTO onetable ( USER_ID, USER_NAME, gender_f )VALUES( '1234', 'testuser', 1 ); COMMIT;

PL/SQL

12/*③PROCEDUREを使用し、②でデータ投入したテーブル「onetable」から 3もう片方のテーブル「twotable」へカーソルを使用しデータを投入する。*/ 4 5--プロシージャ「testproc」を作成 6CREATE OR REPLACE PROCEDURE testproc(USER_ID in VARCHAR2,USER_NAME in VARCHAR2,gender_f in NUMBER) 7IS 8--カーソル「selcur」の宣言をする 9 CURSOR selcur IS 10 SELECT * FROM onetable; 11 12BEGIN 13--カーソルを開く 14 OPEN selcur; 15--1行ごとにデータを取り出す 16 FETCH selcur INTO USER_NAME,USER_ID,gender_f 17 INSERT INTO TABlE VALUES(USER_NAME,USER_ID,gender_f) 18--カーソルを閉じる 19CLOSE selcur; 20 21COMMIT; 22 23END; 24/

試したこと

コメントを参考に/の挿入、
CREATE OR REPLACE PROCEDURE testprocの後に(USER_ID in VARCHAR2,USER_NAME in VARCHAR2,gender_f in NUMBER)を追加しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

KOZ6.0

2020/06/01 23:49

SQL*Plus では「/*」のあとにスペースか改行を入れないと、コメントとみなされず、前のSQLブロックを実行してしまいますので注意してください。
nolyu

2020/06/02 05:48

知りませんでした、ありがとうございます。気を付けます。
guest

回答2

0

PROCEDURE は LOOPがないから1行しか INSERTされません。簡単なところで
FOR LOOPのサンプル

最後の
END;
の次の行に
/
は必須です。

EXCEPTIONはきちんと書きましょう。’エラー’ とだけ表示するのでは何の意味もありません。

数年前にとてもお金を貰えるレベルではない人たちが書いた100本以上のPL/SQLでまったく使い物にならないシステムを見たことがあります。
開発費を払うなんてとんでもない。賠償請求しないとバカにされますよ、ってお客様に伝えて終わり。

投稿2020/06/01 15:54

Orlofsky

総合スコア16415

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

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

nolyu

2020/06/02 05:54

ありがとうございます。/を追加しました。 戴いたURLですが、DECLARE文だったので今回のファイルでは使用できませんでした。
Orlofsky

2020/06/02 06:16

PROCEDURE でも最後の / は必要です。 PL/SQLはつまみ食いではなくきちんと勉強してください。
Orlofsky

2020/06/02 14:09

何を参考にPL/SQLを書いていますか?URLか書籍があるなら質問に追記しては? 間違いを見つけ易くするため、 >2 動作確認済 のINSERTを横1行に直して、あと2行INSERTを追加してください。 今時点でのPL/SQLのBEGIN ~ END の間はコメントを含めてコードは4桁字下げに統一してください。 回答に載せたLOOPは無視で良いの? >INSERT INTO TABlE ... TABlE のCREATE TABLEも追加してください。 質問に追加した / の次にもう1行 SHOW ERROR PROCEDURE testproc を追加して、表示されたエラー・メッセージを質問に追記しては? PROCEDURE の実行文も質問に追記してください。 おむつ交換は有料です。
guest

0

3ではPROCEDUREを作成しているだけですから、実行はされませんよ。

ストアドプロシージャを実行する

投稿2020/06/01 17:38

sazi

総合スコア25184

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問