Запустити збережену процедуру в розробнику SQL?


81

Я намагаюся запустити збережену процедуру, яка має декілька параметрів входу та виходу. Процедуру можна переглянути на моїй панелі "З'єднання", навігацією "Інші користувачі" | Пакети | |

Якщо я клацну правою кнопкою миші, пунктами меню є "Замовити членів за ..." та "Створити модульний тест" (сірий). Можливість "запустити" процедуру не здається можливою, коли користувач отримує до неї доступ.

Я намагався знайти приклад, як створити анонімний блок, щоб я міг запустити процедуру як файл SQL, але не знайшов нічого, що працює.

Хтось знає, як я можу виконати цю процедуру від розробника SQL? Я використовую версію 2.1.1.64.

Спасибі заздалегідь!

EDIT 1:

Процедура, до якої я хочу зателефонувати, має такий підпис:

user.package.procedure(
   p_1 IN  NUMBER,
   p_2 IN  NUMBER,
   p_3 OUT VARCHAR2,
   p_4 OUT VARCHAR2,
   p_5 OUT VARCHAR2,
   p_6 OUT NUMBER)

Якщо я напишу свій анонімний блок так:

DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;

Я отримую помилку:

Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed

Я спробував ініціалізувати змінні out *:

   out1 VARCHAR2(100) := '';

але отримайте ту ж помилку:

РЕДАКТУВАТИ 2:

На основі відповіді Алекса, я спробував видалити двокрапку перед парам і отримати це:

Error starting at line 1 in command:
DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:

   := . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:


Спробуйте помістити змінні OUT всередину BEGIN, перед оператором виконання процедури.
OMG Ponies

Вам не потрібно execute; в PL / SQL, що трактується як початок execute immediate, що відрізняється від SQL execute.
Alex Poole,

2
@sdoca: ти зараз плутаєш два підходи; з вашою версією редагування 2 просто видаліть це слово execute. declareПовинен бути перед begin. Я думаю, що @OMG мав на увазі те, що ви можете оголосити змінні в SQL Developer перед анонімним блоком із variableключовим словом, а потім використовувати :out1синтаксис таким, яким він був спочатку, і в цьому випадку у вас взагалі немає declareрозділу. Але ви змішуєте ці два з вашого останнього коментаря.
Alex Poole,

1
Так, я знав, що розгублений, але не був повністю впевнений, де / як.
sdoca

Відповіді:


75

За допомогою простих типів параметрів (тобто не рекурсорів тощо) ви можете зробити щось подібне:

SET serveroutput on;
DECLARE
    InParam1 number;
    InParam2 number;
    OutParam1 varchar2(100);
    OutParam2 varchar2(100);
    OutParam3 varchar2(100);
    OutParam4 number;
BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;
/


Відредаговано для використання специфікації OP та з альтернативним підходом для використання :varзмінних прив’язки:

var InParam1 number;
var InParam2 number;
var OutParam1 varchar2(100);
var OutParam2 varchar2(100);
var OutParam3 varchar2(100);
var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 33;
    :InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2,
        :OutParam1, :OutParam2, :OutParam3, :OutParam4);
END;
/

-- Display OUT parameters
print :OutParam1;
print :OutParam2;
print :OutParam3;
print :OutParam4;

1
+1 приємна відповідь. З цікавості ви знаєте, що є кращим?
Конрад Фрікс,

@Conrad: Я гадаю, це справа переваг, хоча може бути більше контексту, який змінює :varшлях. Я використовував би declareспосіб за замовчуванням, якщо я робив щось із PL / SQL; але я міг би використати, :varякщо, скажімо, я використовував трохи існуючого коду, скопійованого з Pro * C, який уже мав такий синтаксис, і я не хотів торкатися парм у виклику.
Alex Poole,

2
Дякую за допомогу та детальну відповідь. Я впевнений, що це також допоможе іншим. Одне, на що слід звернути увагу, це те, що вони повинні виконуватися як сценарії, а не як оператори.
sdoca

1
Під час запуску в sql-розробнику мені не доводилося префіксувати імена змінних :(насправді, це не працювало з ним).
haridsv

29

Виконання легко. Отримати результати може бути важко.

Погляньте на це запитання, яке я задав Найкращий спосіб / інструмент, щоб отримати результати від процедури пакету oracle

Короткий зміст цього виглядає так.

Припускаючи, що у вас був пакет з ім'ям mypackage та процедура, яка називається getQuestions. Він повертає рекурсор і приймає рядок імені користувача.

Все, що вам потрібно зробити, це створити новий файл SQL (файл новий). Встановіть підключення та вставте наступне та виконайте.

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;

3
Мені довелося використовувати повне слово "виконувати", а не "виконувати"
Патрік

21

Для тих, хто використовує SqlDeveloper 3+, якщо ви пропустили таке:

SqlDeveloper має функцію безпосереднього запуску збережених процесів / функцій, а вихідні дані відображаються у зручному для читання порядку.

Просто клацніть правою кнопкою миші на функції пакет / збережений proc / збережений, натисніть Runі виберіть, targetщоб бути proc / func, який ви хочете виконати, SqlDeveloper згенерує фрагмент коду для виконання (щоб ви могли ввести свої вхідні параметри). Після виконання вихідні параметри відображаються в нижній половині діалогового вікна, і в них навіть є вбудована підтримка ref курсору: результат курсору відображатиметься як окрема вкладка виводу.


2
Це має бути обрана відповідь.
EvilTeach

12

Відкрийте процедуру в SQL Developer і запустіть її звідти. Розробник SQL відображає запущений SQL.

BEGIN
  PROCEEDURE_NAME_HERE();
END;

6

Використання:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

Замініть "PACKAGE_NAME", "PROCEDURE_NAME" і "parameter_value" на те, що вам потрібно. Параметри OUT потрібно буде оголосити до.


2

Незважаючи на те, що це питання досить давнє, я продовжую натрапляти на той самий результат, не знаходячи простого способу запустити розробника sql. Після кількох спроб я знайшов простий спосіб виконати збережену процедуру від самого розробника sql.

  • У розділі пакунки виберіть бажаний пакет і клацніть правою кнопкою миші на назві пакета (а не на назві збереженої процедури).

  • Ви знайдете варіант для запуску. Виберіть це та надайте необхідні аргументи. Натисніть OK, і ви побачите результат у розділі вихідних змінних нижче

Я використовую розробник SQL версії 4.1.3.20


1

Жодна з цих інших відповідей не спрацювала для мене. Ось що мені потрібно було зробити, щоб запустити процедуру в SQL Developer 3.2.20.10:

SET serveroutput on;
DECLARE
  testvar varchar(100);
BEGIN
  testvar := 'dude';
  schema.MY_PROC(testvar);
  dbms_output.enable;
  dbms_output.put_line(testvar);
END;

І тоді вам доведеться перейти до перевірки таблиці на предмет того, що повинен був зробити ваш proc з цією переданою змінною - результат просто підтвердить, що змінна отримала значення (і теоретично, передала його proc).

ПРИМІТКА (різниці між моїми та іншими):

  • Ні :перед назвою змінної
  • Немає розміщення .package.або .packages.між назвою схеми та назвою процедури
  • Не потрібно вводити &значення змінної.
  • Немає використання в printбудь-якому місці
  • Не використовується varдля оголошення змінної

Всі ці проблеми змусили мене найдовше чухати голову, і ці відповіді, що викликають ці кричущі помилки, можна було видалити, пересмолити та оперяти.


0

Не можу повірити, це не буде виконано в SQL Developer:

var r refcursor;
exec PCK.SOME_SP(:r,
 '02619857');

print r;

АЛЕ це буде:

var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');

print r;

Очевидно, все має бути в одному рядку ..


2
У [Документах SQL * Plus для executeкоманди] зазначено. Однак це не відповідь на питання, яке було задано, і в будь-якому випадку раніше було викладено в більш відповідних відповідях на інші питання .
Alex Poole

Вмів використовувати його в SQL Developer. Дякую
Сергей

0

Використовуючи SQL Developer версії 4.0.2.15 Build 15.21, працює наступне:

SET SERVEROUTPUT ON
var InParam1 varchar2(100)
var InParam2 varchar2(100)
var InParam3 varchar2(100)
var OutParam1 varchar2(100)

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 'one';
    :InParam2 := 'two';
    :InParam3 := 'three';

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1);
    dbms_output.enable;
    dbms_output.put_line('OutParam1: ' || :OutParam1);
END;
/

Ні, вибачте - varдо того, як змінні НЕ працюють - принаймні в SQL Developer 3.2.20.10 і не повинні використовувати двокрапки перед ними - немає необхідності в цьому, знову ж таки, принаймні в 3.2.20.10 (лише причина, чому я не зробив не проголосуйте за це або відредагуйте). Також знадобиться крапка з комою після SET SERVEROUTPUT ON.
vapcguy

0

Щоб запустити процедуру лише для розробника SQL, виконайте наступну команду

ВИКОНАННЯ ПРОЦЕДУРИ_NAME;


-1

Мені не вдалося отримати відповіді @Alex Poole. Однак методом спроб і помилок я знайшов такі роботи (за допомогою SQL Developer версії 3.0.04). Опублікувавши його тут, якщо це допоможе іншим:

SET serveroutput on;

DECLARE
    var InParam1 number;
    var InParam2 number;
    var OutParam1 varchar2(100);
    var OutParam2 varchar2(100);
    var OutParam3 varchar2(100);
    var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;

2
Це те саме, що перша версія у моїй відповіді, за винятком того, що ви додали а varдо кожної змінної в declareблоці, яка є недійсною. Спроба запустити це дає "PLS-00103: Зустрічається символ" ЧИСЛО ", коли очікується одна з наступних ...", і подібні помилки щодо інших п'яти змінних.
Alex Poole,

Я згоден з Алексом. Проголосував проти, тому що var, і мені не потрібно було використовувати .package.у своєму дзвінку, принаймні в 3.2.20.10, який не повинен був бути таким різним, і отримував помилки, коли я це робив. Даремно витратив час на цю відповідь.
vapcguy

-1
--for setting buffer size needed most of time to avoid `anonymous block completed` message
set serveroutput on size 30000;

-- declaration block in case output need to catch
DECLARE
--declaration for in and out parameter
  V_OUT_1 NUMBER;
  V_OUT_2 VARCHAR2(200);
BEGIN

--your stored procedure name
   schema.package.procedure(
  --declaration for in and out parameter
    V_OUT_1 => V_OUT_1,
    V_OUT_2 => V_OUT_2
  );
  V_OUT_1 := V_OUT_1;
  V_OUT_2 := V_OUT_2;
  -- console output, no need to open DBMS OUTPUT seperatly
  -- also no need to print each output on seperat line 
  DBMS_OUTPUT.PUT_LINE('Ouput => ' || V_OUT_1 || ': ' || V_OUT_2);
END;

-2

Створення блоку Pl / SQL може бути болючим, якщо у вас багато процедур, які мають багато параметрів. Існує програма, написана на python, яка робить це за вас. Він аналізує файл із деклараціями процедур і створює веб-програму для зручних викликів процедур.


-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.