こんにちは。教えてください。
PL/SQLを使うのが初めで戸惑っています。
まず、PROCEDUREで
===========================
BEGIN

SELECT NAME FROM TABLE1 WHERE NAME='tanaka';

END;
/
===========================
このように書いて実行させようとすると、「コンパイルエラー」
「INTO句はこのSELECT文に入ります」というエラーが出ます。
SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに??

ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて
わかりませんでした。
PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

コーディング例です。



**************************************************
*非ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB1
.IS
.
.  w_NAME1  CHAR(10);
.
.BEGIN
.
.  SELECT NAME1 INTO w_NAME1 FROM TABLE1
.  WHERE TBL1_KEY = 'tanaka';
.
.  UPDATE TABLE2 SET NAME2 = w_NAME1
.  WHERE TBL2_KEY =  'tanaka';
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBACK;
.END;
./
**************************************************
*ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB2
.IS
.
.  w_TABLE1 TABLE1%ROWTYPE;
.
.  CURSOR  c_TABLE1 IS
.  SELECT  NAME1
.  FROM   TABLE1
.  ORDER BY NAME1;
.
.BEGIN
.
.  OPEN c_TABLE1;
.
.  LOOP

.    FETCH
.      c_TABLE1
.    INTO
.      w_TABLE1;
.    EXIT WHEN c_TABLE1%NOTFOUND;
.
.    UPDATE TABLE2 SET NAME2 = w_TABLE1.w_NAME1
.    WHERE TBL2_KEY = w_TABLE1.w_TBL1_KEY;
.
.  END LOOP;
.
.  CLOSE c_TABLE1;
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBACK;
.END;
./

先頭のピリオドは無視してください。どこかにミスがあったらごめんなさい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご丁寧にコードでの解説、すごくわかりやすかったです。
実際mori0309さんのコーディングを参考に実行してみたら
値を取得することができました。
今回の業務はこれで事足りるのですが、これからも使うことがあると思うので
ちゃんと理解するよう勉強したいと思います。大変参考になりました。
どうもありがとうございました。

お礼日時:2001/05/14 22:14

こんにちは、jotarou といいます。


コーディングは、ishmaster さんので良いと思います。

>ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎてわかりませんでした。

これに関しては、”暗黙カーソル”と入れてお調べください。

>SQLServerで使っていたSQLでは通用しないのでしようか・・・。

 難しいとは聞いているのですが、全くの初心者でないのでしたら、通用する部分があると思いますけど・・・。

では・・。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
教えていただいたとおり、暗黙カーソルでたくさんヒットしました。
まず、カーソルとはなんぞや、から勉強しないといけません。
一冊本を買ってじっくり取り組もうと思います。
みなさんに教えていただいたこと大変勉強になりました。
また質問することもあると思いますがよろしくお願い致します。

お礼日時:2001/05/14 22:12

PL/SQLでSelect文を使うときには、カーソルなり変数(ishmasterさんの言っている領域)に代入する必要があります。

でないと、Select文で引っ張ってきたデータを使うことができません。
変数・カーソルへの代入というと構文が少し変なのですが、ishmasterさんの構文でデータベースからデーターを持ってこれると思ってください。

PL/SQLは、Select文は普通のSQLと少し違いますが、INSERT、DELETE、UPDATEはほとんど普通に使えます。ただし、CREATE、DROPなどは原則として使えません。(方法はありますが・・・)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
私はVBやAccessのように単純なSQLをぽんぽんと並べれば
実行してくれるのかと勘違いしていました。
そうではないんですね。
少し勉強しないとだめみたいです。
みなさんに教えていただいたことを頭にいれてがんばりたいと思います。
ありがとうございました。

お礼日時:2001/05/14 22:08

SELECT NAME INTO work FROM TABLE1 WHERE NAME='tanaka';


じゃないでしょうかねえ。
INTOで読み込まれる領域を指定するんではないかと。
PL/SQLは知りませんが。

この回答への補足

さっそくの解答ありがとうございます。
領域ですか。
領域とは・・・・・・・????

環境を書き忘れていました。
WinNT4.0(SR6)
Oracle8
ObjectBrowser7.0
です。

OracleもObjectBrowserも使うのが初めてで右も左もわからない状態です。SQLServerで使っていたSQLでは通用しないのでしようか・・・。

補足日時:2001/05/11 17:36
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
せっかく教えていただいたので理解力不足ですみませんでした。
みなさんの回答を参考に、しっかり勉強致します。
ありがとうございました。

お礼日時:2001/05/14 22:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QStatement ignored というエラー

Oracle 9iを使ってsqlファイルを実行させたところ、タイトルにあるように、
PL/SQL: SQL Statement ignored
というエラーメッセージが出力されました。
いろいろ検索してみると、これは、私にシステム権限がないことからおこるとあったのですが、
その設定変更の仕方がいまいちよくわかりませんでした。設定変更のしかたを教えていただけないでしょうか。
また、設定変更したことによって変わるのは私自身のシステム権限だけであって、他にコンピュータ(UNIX)を共有している人たちには影響はありませんよね?
立て続けに質問ばかりすみませんが、よろしくおねがいします。

Aベストアンサー

PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。
前後のエラーも記載していただいた方が良いとは思いますが。

システム権限の付与方法は下記で行うことが可能です。
※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。
1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン
2.grant execute procedure to [対象ユーザ];
  または
  grant resource to [対象ユーザ];

以上で一応権限付与はできますが、どのような処理を行いたいかによって、これだけで解決するかどうかわかりません。
また、他の人への影響ですが、ユーザをどのように使用しているか、どのようなポリシーのシステムかによって異なります。(「私自身」というのが、セッションのことかスキーマのことかわかりませんでした。)
同じユーザを他の人と共通で使っていれば、もちろん他の人へ影響が出ますし、一人1ユーザ(スキーマ)で割当てられていれば、影響なく使えます。
「影響が出る」という意味は、セキュリティレベルが権限付与された分落ちるということで、機能的に使用できなくなることはありません。

なお、セッション単位で権限を割当てる方法はないと思っています。
付与した権限をセッション終了次第revokeすれば、元に戻るのではないでしょうか。

PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。
前後のエラーも記載していただいた方が良いとは思いますが。

システム権限の付与方法は下記で行うことが可能です。
※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。
1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン
2.grant execute procedure to [対象ユーザ];
  または
  grant resource to [対象ユーザ];

以上で一応権限付与はできますが、どのような処理を...続きを読む

QSELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?

初めてこちらで質問させていただきます。
どうぞよろしくお願いします。
早速ですが、
現在ストアドファンクション(PL/pgSQL)にて以下のような形になっています。
変数d1,d2,d3に値をセットするにあたり
テーブルt1を3回スキャンしています。
これを1回のスキャンでセットするような
方法はないのでしょうか?

DECLARE
d1 integer;
d2 integer;
d3 varchar(10);

begin
select min(c1) into d1 from t1;
select min(c2) into d2 from t1;
select min(c3) into d3 from t1;
各種処理
return v;
end;

気持ち的には以下のようなSQLを書きたいのですが、
syntax error となります。
(NG例)
select min(c1) into d1,min(c2) into d2,min(c3) into d3 from t1;

何か良い案がありましたら教えてください。
「それは出来ません」と言う回答でもありがたいです。
※あきらめがつくので。。

それではよろしくお願いします。

初めてこちらで質問させていただきます。
どうぞよろしくお願いします。
早速ですが、
現在ストアドファンクション(PL/pgSQL)にて以下のような形になっています。
変数d1,d2,d3に値をセットするにあたり
テーブルt1を3回スキャンしています。
これを1回のスキャンでセットするような
方法はないのでしょうか?

DECLARE
d1 integer;
d2 integer;
d3 varchar(10);

begin
select min(c1) into d1 from t1;
select min(c2) into d2 from t1;
select min(c3) into ...続きを読む

Aベストアンサー

select min(c1),min(c2),min(c3) into d1,d2,d3 from t1;
でダメ?

QPL/SQL PLS-00103エラーについて

PL/SQL PLS-00103エラーについて

夜分遅くに申し訳ございません。
PL/SQLのコーディングを実施し、コンパイル中にPLS-00103エラーが発生してしまったのですが、
対処方法がわからず困ってしまいました。

・メッセージ内容:”PLS-00103: 記号"="が見つかりました。”


上記メッセージで指定されていたソース内容(イメージ)↓
--------------------------------------------------------------


BEGIN
LV_STEP := '**登録処理開始'  -- 左記の:=の=部分がエラーメッセージで指定されていました。(LV_STEPはログ出力用の変数)

CURSOR AAAA IS
SELECT GG.EPLY_NO GG_EPLY_NO
,GG.R_CD GG_R_CD
,GG.S_CARD GG_S_CARD

    ・
   ・
FROM GRA_GRA_TR GG



------------------------------------------------------------------

といった感じなのですが、
このPLS-00103エラーの対処方法をどなたかご教示いただけませんでしょうか。
よろしくお願いいたします。

PL/SQL PLS-00103エラーについて

夜分遅くに申し訳ございません。
PL/SQLのコーディングを実施し、コンパイル中にPLS-00103エラーが発生してしまったのですが、
対処方法がわからず困ってしまいました。

・メッセージ内容:”PLS-00103: 記号"="が見つかりました。”


上記メッセージで指定されていたソース内容(イメージ)↓
--------------------------------------------------------------


BEGIN
LV_STEP := '**登録処理開始'  -- 左記の:=の=部分がエラーメッセージで指定されていま...続きを読む

Aベストアンサー

PLS-00103は構文解析エラーです。
指定されている行にはセミコロンがありませんが、
これが原因だとすると、
エラーメッセージは後ろに続く文で出るはずです。
エラーメッセージで示された箇所より前の部分(行)を調べてください。

# ソースの内容をイメージで示されても困ります。
# 回答者に超能力者は(おそらく)いないと思いますので
# 勘で答えるよりほか仕方がありません。

QPL/SQLのコンパイルエラーについて(ignored)

以下はPL/SQLの一部です。

if (vn_CNT > 0 ) then
-- 座席マスタ更新実行
行27update M_SEAT
行28 set M_SEAT.CD_PC = :new.NK_PC ,
行29 M_SEAT.CD_TANTO = :new.CD_TANTO,
行30 where M_SEAT.NO_PORT = :new.NO_PORT ;
end if ;


実行すると以下のエラーがでます。。
行番号 = 27 列番号 = 3 エラー・テキスト = PL/SQL: SQL Statement ignored
行番号 = 30 列番号 = 5 エラー・テキスト = PL/SQL: ORA-01747: user.table.column、table.columnまたは列指定が無効です

ちなみにOEMコンソールで作成しています。
M_SEATというテーブルは存在します。

権限どうのと言われているのはわかるのですが結局なにが原因なのかわかりません。
どなたか教えてください。

以下はPL/SQLの一部です。

if (vn_CNT > 0 ) then
-- 座席マスタ更新実行
行27update M_SEAT
行28 set M_SEAT.CD_PC = :new.NK_PC ,
行29 M_SEAT.CD_TANTO = :new.CD_TANTO,
行30 where M_SEAT.NO_PORT = :new.NO_PORT ;
end if ;


実行すると以下のエラーがでます。。
行番号 = 27 列番号 = 3 エラー・テキスト = PL/SQL: SQL Statement ignored
行番号 = 30 列番号 = 5 エラー・テキスト = PL/SQL: ORA-01747: user.table.column、table.columnまたは列指定が無効です...続きを読む

Aベストアンサー

if (vn_CNT > 0 ) then
-- 座席マスタ更新実行
行27 update M_SEAT
行28 set M_SEAT.CD_PC = :new.NK_PC ,
行29 M_SEAT.CD_TANTO = :new.CD_TANTO
行30 where M_SEAT.NO_PORT = :new.NO_PORT ;
end if ;

これでどうでしょうか?

NK_PCというカラムはありますか?

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Qselectの単純繰り返し

oracle11gで
sqlplusで接続して、とあるテーブルのselectを100回繰り返したいのですが
for文はどう書けばよいのでしょうか

↓selectはこんなのでOKです
select * from testtable;

Aベストアンサー

--------------------------------------------------------------------------------
DECLARE
str VARCHAR2(2000);
BEGIN
DBMS_OUTPUT.PUT_LINE('----結果------');
FOR i IN 1..10 LOOP
select dummy into str from dual;
DBMS_OUTPUT.PUT_LINE(i||':'||str);
END LOOP;
END;
----結果------
1:X
2:X
3:X
4:X
5:X
6:X
7:X
8:X
9:X
10:X
PL/SQLが実行されました(0 msec.)
--------------------------------------------------------------------------------

Qカーソル0件の時にエラーを発生させる

以下の処理をしようと考えています。

Aテーブルをカーソルで検索
    →0件だった場合にはエラー ・・・ (1)
    →データが入っていた場合には処理
    →カーソルのデータがなくなったら処理を正常終了

カーソルに入っているデータが0件だった場合、Oracle上ではエラーとはみなされず、処理が正常終了してしまいます。
カーソルデータが0件だった場合にエラーを発生させるにはどのようにコーディングすればよいですか?

Aベストアンサー

最初のFETCHをループの外ですればいいのでは。

open cur1;
fetch cur1 into rec1;
if cur1%notfound then
close cur1;
raise NO_DATA_FOUND;
end if;

loop
--処理
fetch cur1 into rec1;
exit when cur1%notfound;
end loop;

close cur1;

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング