-1

私はオラクルで多くのストアド プロシージャを書いたことがありません。いくつかのチュートリアル (例: http://plsql-tutorial.com/plsql-procedures.htm )を読み、見 たものに従ってSP をモデル化しようとしましたが、まだエラーが発生しています。手順とエラーの小さなサンプルを次に示します。

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
4

1 に答える 1

4

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

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

ただし、通常、このような列のリストを省略したコードを作成することはお勧めできません。これは、2 つのテーブルにまったく同じ列がまったく同じ順序で定義されていることを前提としているため、誰かがテーブルの 1 つに別の列を追加しようとすると、コードが壊れます。また、誤って間違った列からデータをコピーする可能性も生じます。一般に、次のように書く方が堅牢です

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> 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.
于 2012-04-20T17:15:04.293 に答える