2012-04-20 6 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> 

내가 선언 섹션을 잃었 느낌을 얻을 수는 있지만, 나는 내가 선언 할 수 있겠 이해하지 않습니다 : -/

어떤 도움 것 감사하겠습니다. 이 같은 후 것 같은

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; 

일반적으로, 그러나, 열 목록을 생략하는 다음과 같은 코드를 작성하는 나쁜 생각입니다. 두 테이블은 정확히 동일한 순서로 정의 된 동일한 열을 가지고 있다고 가정하므로 다른 열을 테이블 중 하나에 추가하기로 결정하면 코드가 손상됩니다. 또한 실수로 잘못된 열의 데이터를 복사 할 수도 있습니다. 당신이 사용하는 어떤 도구 예를 들어

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 "기호가 나타납니다. [email protected]에서 <식별자> 파티션 하위 분할 "는" –

+0

@BadProgrammer - 난 구가 작동 표시하는 예를 게시했다. 현재 사용중인 코드를 포함하도록 질문을 업데이트 할 수 있습니까? –

관련 문제