2013-03-21 3 views
1

Выполнение этой процедуры происходит следующим образом.PLS-00103: Обнаружен символ ","

CREATE OR REPLACE PROCEDURE SAMPLE 
IS 
BEGIN 
EXECUTE IMMEDIATE 
    'CREATE TABLE COLUMN_NAMES AS (
    SELECT LISTAGG(COLUMN_NAME, ',') WITHIN GROUP (ORDER BY COLUMN_NAME) AS STUDENTS 
    FROM 
     (SELECT DISTINCT COLUMN_NAME 
      FROM BW_COLUMN_ROW_CELL_JOIN) 
    )'; 
END; 
/

дает:

PLS-00103: Encountered the symbol "," when expecting one of the following:  
* & = - + ; </> at in is mod remainder not rem return  
returning <an exponent (**)> <> or != or ~= >= <= <> and or 
like like2 like4 likec between into using || multiset bulk member submultiset 

Может ли одна сказать, что плохого в этом?

Спасибо.

+0

@Dazzal. Спасибо за ваш ответ ... На самом деле, я думаю, что Execute Immediate следует использовать в хранимой процедуре, когда мы хотим выполнить команды DDL, которые они запускают во время выполнения. – user1990383

ответ

3

Другой способ (в Oracle 10g и более поздний) - использовать альтернативную строковую литературу - это означает, что вам не нужно беспокоиться о том, чтобы правильно избежать всех одинарных кавычек в строке, например. q'{my string's got embedded quotes}':

CREATE OR REPLACE PROCEDURE SAMPLE 
IS 
BEGIN 
EXECUTE IMMEDIATE q'[ 
    CREATE TABLE COLUMN_NAMES AS (
    SELECT LISTAGG(COLUMN_NAME, ',') WITHIN GROUP (ORDER BY COLUMN_NAME) AS STUDENTS 
    FROM 
     (SELECT DISTINCT COLUMN_NAME 
      FROM BW_COLUMN_ROW_CELL_JOIN) 
    )]'; 
END; 
/
1

Проблема, я думаю, у вас есть одинарные кавычки в одинарных кавычках. Я не могу проверить это на данный момент, но я предлагаю вам попробовать следующее (обратите внимание на внутренние кавычки двойные кавычки '', который избегает их:

CREATE OR REPLACE PROCEDURE SAMPLE 
IS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE COLUMN_NAMES AS (SELECT LISTAGG(COLUMN_NAME, '','') WITHIN GROUP (ORDER BY COLUMN_NAME) AS STUDENTS FROM (SELECT DISTINCT COLUMN_NAME FROM BW_COLUMN_ROW_CELL_JOIN))'; 
END; 
/

Я бы также попробовать create table часть кода автономного первый раз, чтобы убедиться, что его действительным до упаковки его в прок.

+0

Ничего себе, теперь он работает ... Я просто добавил двойные кавычки в запятую ... и его сделали ... Большое вам спасибо – user1990383

+0

@ user1990383 good stuff :-) –

-1

Вы не можете использовать single quotes непосредственно в select statement из Execute Immediate это нужно быть закодированы с использованием CHR(39)

CREATE OR REPLACE PROCEDURE SAMPLE 
IS 
BEGIN 
    EXECUTE IMMEDIATE 
    'CREATE TABLE COLUMN_NAMES AS (
      SELECT LISTAGG(COLUMN_NAME,'||chr(39)||','||chr(39)||') WITHIN GROUP (ORDER BY COLUMN_NAME) AS STUDENTS 
      FROM 
      (SELECT DISTINCT COLUMN_NAME FROM BW_COLUMN_ROW_CELL_JOIN))'; 
END; 
+0

-1 неверно, вы * можете * использовать одинарные кавычки –

+0

execute незамедлительно выполнит любой действительный оператор sql, который находится в строковом формате, в таких случаях, если вы укажете что-то вроде «выполнить немедленный» выберите «ошибка» из двойного '; ' . Это даст ошибку времени выполнения, т.е. ' PLS -00103: встречается символ «ОШИБКА» при ожидании одного из следующих: * & = - +; at in is mod restback not rem return ' – Aspirant

+0

поэтому, чтобы использовать единые коды в операторе SQL для немедленного выполнения, мы будем использовать chr (39) !! Если я ошибаюсь, скажите мне альтернативу этому – Aspirant

Смежные вопросы