-1

我没有用oracle写过很多存储过程。我通读了一些教程(例如: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(或IS) 。BEGIN

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

然而,一般来说,编写这样的代码来省略列列表是个坏主意。假设这两个表具有完全相同的列以完全相同的顺序定义,因此如果有人决定向其中一个表添加另一列,您的代码将中断。它还可能导致您无意中从错误的列中复制数据。编写类似的东西通常更健壮

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 回答