2012-04-20 116 views
-1

我还没有用oracle编写很多存储过程。我阅读了一些tutotorials(例如: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> 

,我感到我很想念声明部分的印象,但我不明白,我应该要述说: -/

任何帮助将不胜感激。


随后从第一反应Justin的意见,现在得到不同的错误:

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

?你可以尝试使用SQL * Plus来确保你的工具没有问题(尤其是在可能存在未终止的SQL语句的GUI应用程序中)?如果你实际上在你的'INSERT'中使用了表空间的名称而不是模式的名字,你会得到一个ORA-00942错误。一般来说,尽管您发布的语法是有效的,但您不会在“SELECT”列中使用括号。 – 2012-04-20 18:30:53

+0

你说得对,我正在使用模式名称而不是表空间。我正在使用sqldeveloper。 – 2012-04-20 22:13:03

+0

您确定没有另一个SQL语句位于CREATE OR REPLACE PROCEDURE语句之上,但没有正确结束吗?你可以在SQL * Plus中运行CREATE OR REPLACE PROCEDURE语句吗? – 2012-04-20 22:14:25

回答

4

这听起来像你这样的事情后。如果您没有声明任何参数,则不希望在过程的名称后加括号。即使您不打算声明任何本地变量,也需要在BEGIN之前使用关键字AS(或IS)。

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. 
+2

+1“为了省略列表” – 2012-04-20 17:33:04

+0

谢谢,贾斯汀。你对列名称是正确的;我只是想要一个快速的方式来展示我的问题,同时保留主要点(存储过程错误)而不会泄露任何实际数据。 感谢您的建议。我试过了,但现在得到了:“PLS-00103:遇到下列其中一项时遇到符号”AS“: 。,@ in <标识符> 分区子分区 “” – 2012-04-20 17:35:47

+0

@BadProgrammer - 我发布了一个显示工作语法的示例。你能否更新你的问题以包含你目前使用的代码? – 2012-04-20 18:05:42