2012-04-20 5 views
-1

私はoracleに多くのストアドプロシージャを記述していません。私はいくつかの教授法(例えば:http://plsql-tutorial.com/plsql-procedures.htm)を読んで、私が見た後に私のSPをモデル化しようとしましたが、私はまだ間違いがあります。すべてのヘルプは/Oracleストアドプロシージャを書く

う - :

create or replace 
PROCEDURE TEST_SP() 
    BEGIN 

insert into tablespace.tablename 
select * from testtable; 

END TEST_SP; 

PLS-00103: Encountered the symbol ")" when expecting one of the following: 

    <an identifier> <a double-quoted delimited-identifier> 

私は宣言セクションをしないのです印象を受けるが、私は私が宣言されることになっています理解していない:ここでは小さなサンプル手順とエラーされます感謝する。


は今、別のエラーを取得し、最初の応答からジャスティンのアドバイスに従っ:

create or replace 
PROCEDURE TEST_SP 
AS 
    BEGIN 

insert into tablespace.tablename (col1, col2) 
select (col1, col2) from testtable; 

END TEST_SP; 

PLS-00103: Encountered the symbol "AS" when expecting one of the following: 
. , @ in <an identifier> <a double-quoted delimited-identifier> partition subpartition 
+2

として

create or replace PROCEDURE TEST_SP AS BEGIN insert into tablespace.tablename(<<list of columns>>) select <<list of columns>> from testtable; END TEST_SP; 

ような何かを書くために、一般的に、より堅牢なのですか? SQL * Plusを使用して、ツールに問題がないことを確認できますか(特に、未終了のSQL文が存在するGUIアプリケーションの場合) INSERTでスキーマの名前ではなく表スペースの名前を実際に使用している場合は、ORA-00942エラーが発生します。一般的に、投稿した構文は有効ですが、 'SELECT'の列名の前後に括弧を入れません。 –

+0

あなたが正しいです、私はテーブルスペースではなくスキーマ名を使用しています。私はsqldeveloperを使用しています。 –

+0

'CREATE OR REPLACE PROCEDURE'文の上に正しく終了していない別のSQL文がないのは確かですか? SQL * Plusで 'CREATE OR REPLACE PROCEDURE'文を実行できますか? –

答えて

4

あなたはこのような何か後にしているようですね。パラメーターを宣言していない場合は、プロシージャーの名前の後ろに括弧を入れたくありません。ローカル変数を宣言しない場合でも、BEGINの前にキーワードAS(またはIS)が必要です。

create or replace PROCEDURE TEST_SP 
AS 
BEGIN 
    insert into tablespace.tablename 
    select * from testtable; 
END TEST_SP; 

しかし、一般的に、列のリストを省略したこのようなコードを書くことは悪い考えです。これは、2つのテーブルがまったく同じ列を同じ順序で定義していることを前提としているため、誰かがテーブルの1つに別の列を追加することに決めた場合、コードは破損します。誤って間違った列からデータを誤ってコピーしている可能性もあります。あなたが使用しているどのようなツールの例

SQL> create table foo(col1 number); 

Table created. 

SQL> create table foo_cpy(col1 number); 

Table created. 

SQL> ed 
Wrote file afiedt.buf 

    1 create or replace procedure test_sp 
    2 as 
    3 begin 
    4 insert into foo(col1) 
    5  select col1 
    6  from foo_cpy; 
    7* end test_sp; 
SQL>/

Procedure created. 
+2

+1は "それは列のリストを省略します" –

+0

ありがとう、ジャスティン。あなたは列名について正しいです。私はちょうど実際のデータを放棄することなく、主なポイント(ストアドプロシージャのエラー)を保存しながら私の問題を示すための迅速な方法を望んでいた。 提案していただきありがとうございます。私は試しましたが、現在は次のようになっています: "PLS-00103:次のいずれかを予期しているときにシンボル" AS "を検出しました: 。、@ in <識別子> <ダブル引用符で囲まれたdelimited-identifier>パーティションサブパーティション "" –

+0

@BadProgrammer - 構文の動作を示す例を掲載しました。現在使用しているコードを含むように質問を更新できますか? –

関連する問題