Является ли этот символ косой черты в сценарии Oracle PL / SQL ошибкой? - PullRequest
7 голосов
/ 11 октября 2008

Я разбираю серию сценариев SQL для моей компании, написанных на Oracle PL / SQL. Я наткнулся на важный сценарий со странно расположенной косой чертой внизу. Это проверяется в CVS таким образом. Это чисто синтаксическая ошибка или есть какая-то функция, о которой я не знаю. Слегка запутанный скрипт:

set serveroutput on size 2000;
--PL/SQL block to link ISSN in serial base on a company's ISSN text file

declare
    cursor ItemCursor is
        select issn is2 from web.obfuscated1 where issn is not null
            union
        select eissn is2 from web.obfuscated1 where eissn is not null;

    cursor ItemCursor1(aIS varchar2) is
        select obfuscated1_uid from web.obfuscated1 where group_num is null and issn in (
            select distinct issn from web.obfuscated1 where issn = aIS or eissn = aIS
                union
            select distinct eissn from web.obfuscated1 where issn = aIS or eissn = aIS
        )
            union
        select obfuscated1_uid from web.obfuscated1 where eissn in (
            select distinct issn from web.obfuscated1 where issn = aIS or eissn = aIS
                union
            select distinct eissn from web.obfuscated1 where issn = aIS or eissn = aIS
        );

    cursor ItemCursor2(aIS9 varchar2) is
        select obfuscated1_uid from web.obfuscated1 where issn in (
            select distinct issn from web.obfuscated1 where issn = aIS9 or eissn = aIS9
                union
            select distinct eissn from web.obfuscated1 where issn = aIS9 or eissn = aIS9
        ) and group_num is null;

    agroup      number(8);
    processCount    number(8);

    ------------------------------------------------------
    -- MAIN BLOCK -----------------------------------
    -------------------------------------------------
begin
    processCount := 0;

    agroup := null;
    for itemRec in ItemCursor loop
        agroup := null;
        begin
            select group_num into agroup from web.obfuscated1 where issn in (
                select distinct issn from web.obfuscated1 where issn = itemRec.is2 or eissn = itemRec.is2
                    union
                select distinct eissn from web.obfuscated1 where issn = itemRec.is2 or eissn = itemRec.is2
            ) and group_num is not null and issn is not null and eissn is not null and rownum <= 1;

        exception
            when no_data_found then
                agroup := null;
            when others then
                agroup := null;
        end;

        if agroup is not null then
            for itemRec2 in ItemCursor2(itemRec.is2) loop
                update web.obfuscated1 set group_num = agroup where obfuscated1_uid = itemRec2.obfuscated1_uid;
                commit;
            end loop;
        else
            processCount := processCount + 1;
            for itemRec1 in ItemCursor1(itemRec.is2) loop
                update web.obfuscated1 set group_num = processCount where obfuscated1_uid = itemRec1.obfuscated1_uid;
                commit;
            end loop;
            commit;
        end if;
    end loop;

    dbms_output.put_line('Total record read: ' || processCount);
exception
    when others then
        dbms_output.put_line('ORA' || sqlcode);
        dbms_output.put_line(substr(sqlerrm, 1, 255));
        dbms_output.put_line('ORA- Error during processing ' );
    end;
/
exit;

Ответы [ 5 ]

21 голосов
/ 11 октября 2008

Косая черта имеет значение :

Выполняет самое последнее выполненное Команда SQL или блок PL / SQL, который хранится в буфере SQL. Вы можете введите косую черту (/) в команде подсказка или в строке номер подсказки многострочная команда. Команда слэша функционирует аналогично RUN, но делает не выводить команду.

7 голосов
/ 27 февраля 2013

При использовании Oracle вы «смешиваете» три разные грамматики.

  • SQL
  • PL / SQL
  • sqlplus (клиент командной строки)

sqlplus может выполнять / обрабатывать операторы SQL и PL / SQL, отправляя их на сервер БД. В то время как команды sqlplus интерпретируются самим sqlplus.

Точка с запятой ";" не является частью грамматики SQL, и sqlplus распознает ее как конец оператора SQL. В то время как для PL / SQL это часть грамматики, и она должна явно указывать sqlplus, что здесь оператор заканчивается и должен выполняться с использованием косой черты.

Другими командами sqlplus являются «EXIT», «DEFINE», «VARIABLE», «PRINT», «SET » (кроме SET ROLE).

С другой стороны, жаба, например, распознает конец блока PL / SQL, когда видит пустую строку.

5 голосов
/ 11 октября 2008

/ в конце указывает интерпретатору выполнить загруженный скрипт

в основном вы набираете вещи, затем набираете "/", и то, что вы только что набрали, будет выполняться

3 голосов
/ 11 октября 2008

И слеш, и "выход" заставляют меня подозревать, что вы должны запускать этот скрипт из SQLPLUS. Вы можете получить ошибку, если попытаетесь отправить ее в Oracle другим способом. В таком случае просто избавьтесь от обоих.

1 голос
/ 11 октября 2008

Это не ошибка. Выполняет скрипт.

Это полезно, когда вы объединяете различные сценарии в один файл и хотите, чтобы каждая отдельная задача выполнялась до следующей.

т.е. создать функцию / Создать хранимую процедуру, использующую функцию

Без косой черты хранимая процедура может быть создана с ошибками или может не быть создана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...