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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2618閲覧

Oracle PHP でのINSERT~EXISTS文でORA-00933が発生する

ttakka

総合スコア3

Oracle

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/08/22 07:53

編集2020/08/22 09:16

前提・実現したいこと

指定した条件に合致するデータがあればINSERTを行うようにしたいです。
一度データベースに書き込めたのですが、少し調整を行ってから書き込めなくなってしまいました。
該当部分のコードはほぼ触っていないと記憶しています、エラーコード的に単純なミスかと思い見直し書き直しを行っているのですが一向に治りません。

EMP_DATA

論理名制約
EMP_IDNUMBERNOT NULL
EMP_PASSVARCHAR2(20)
SEIVARCHAR2(20)
MEIVARCHAR2(20)
BIRTHDAYDAY

WORK_TIME

論理名制約
EMP_IDNUMBERNOT NULL
IN_TIMEDATENOT NULL
BREAK_OUTDATE
BREAK_INDATE
OUT_TIMEDATE

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

Warning: oci_execute(): ORA-00933: SQLコマンドが正しく終了されていません。 php上で実行した場合文字化けしているので、Oracle上で同等の文を実行した際のエラーメッセージを表記しています。

該当のソースコード

PHP

1 $sql = "INSERT INTO WORK_TIME (EMP_ID,IN_TIME) 2 VALUES (:id, SYSDATE) 3 WHERE EXISTS (SELECT * //エラーが表示される行 4 FROM EMP_DATA 5 WHERE EMP_ID = :id AND EMP_PASS = :pass)"; 6 $stid = oci_parse($conn,$sql); 7 oci_bind_by_name($stid, ':id', $id); 8 oci_bind_by_name($stid, ':pass', $pass); 9 oci_execute($stid);

行3でエラーが発生しました。:
ORA-00933: SQLコマンドが正しく終了されていません。

同等の文をOracle上で動かしても同様のエラーが表示されます。

試したこと

構文、テーブル名カラム名の見直し書き直し


値は直接入力ですが、Oracle上で動作確認を行った文

SELECT * FROM WORK_TIME WHERE EXISTS
(SELECT * FROM EMP_DATA WHERE EMP_ID = [値] AND EMP_PASS = [値]);

INSERT INTO WORK_TIME (EMP_ID,IN_TIME)
VALUES ([値], SYSDATE);


上記の文をphp上で変数バインドを使用した場合も動作しました。

SELECT * FROM WORK_TIME WHERE EXISTS
(SELECT * FROM EMP_DATA WHERE EMP_ID = :id AND EMP_PASS = :pass);

INSERT INTO WORK_TIME (EMP_ID,IN_TIME)
VALUES (:id, SYSDATE);

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

os:windows10
DB:Oracle 18c XE
ブラウザ:googlechrome
xmappを使いローカル環境でPHP,Oracle共に同一PCで作動させています。

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

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

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

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

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

m.ts10806

2020/08/22 08:11

Oracleのバージョンと、CREATE TABLE文 あとサンプルデータのINSERT文を提示指定ください。 あと、PHPからじゃなくて、Oracleに対して直に実行して想定の結果が得られるか確認していますか?
ttakka

2020/08/22 09:03

ありがとうございます、テーブル情報・動作確認を行った文・バージョン情報等追加しました。 部分的に分けた構文だと動作はしましたので、該当のソースコード部分で[SQL構文]か[変数バインド]の辺りで何かやらかしているとは思うのですが・・・。
guest

回答2

0

自己解決

PHP

1 $sql = "INSERT INTO WORK_TIME (EMP_ID,IN_TIME) 2 SELECT :id, SYSDATE FROM DUAL 3 WHERE EXISTS(SELECT * 4 FROM EMP_DATA 5 WHERE EMP_ID = :id AND EMP_PASS = :pass)";

INSERT文でEXISTS句を使用する際のVALUES句に相当する部分の記述方法が違ったようです。
上記のように編集した所動作しました。

投稿2020/08/22 10:24

ttakka

総合スコア3

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

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

Orlofsky

2020/08/23 03:53

SELECT は1つで良いし、EXISTSは不要。 SQLはシンプルにパフォーマンスが良いように書けないと、ちょっとデータが増えただけで使い物にならなくなります。
guest

0

SQL

1 $sql = "INSERT INTO WORK_TIME (EMP_ID,IN_TIME) 2 SELECT * 3 FROM EMP_DATA 4 WHERE EMP_ID = :id AND EMP_PASS = :pass)";

で試しては?

質問のエラーはエラーコードだけでなく、エラーメッセージもいっしょに載せる習慣を身に付けましょう。

投稿2020/08/22 08:12

Orlofsky

総合スコア16415

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

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

ttakka

2020/08/22 09:05

ありがとうございます、自身のPHP・ブラウザ環境だと文字化けしてしまっていたのでOracle上で同様の文を動作させた際のエラーメッセージを追記致しました。 記載して頂いたコードも同様のエラーが表示されてしまいました、情報を上手く書けず申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問