Запустите SCRIPT из PL / SQL Block - PullRequest
       10

Запустите SCRIPT из PL / SQL Block

3 голосов
/ 12 января 2012

Как использовать «НАЧАТЬ СКРИПТ» в блоке pl / sql?

Я хочу использовать что-то вроде этого

declare
begin
   proc(para1,para2);
   execute immediate 'start prompt1' ; 
end;
/

Также я хочу знать, могу ли я получить значение из prompt1 в мой блок PL / SQL, где я вызываю скрипт? Потому что мне нужно использовать значение для выполнения некоторых операций в блоке PL / SQL.

Ответы [ 5 ]

9 голосов
/ 12 января 2012

Это 2012 2017. Сценарии - это неуклюжее и хрупкое похмелье прошлого тысячелетия.Oracle обладает фантастическим набором функций, которые мы можем выполнять в PL / SQL, плюс есть хранимые процедуры Java и планирование запуска заданий.Помимо запуска DDL для создания или изменения схем, едва ли есть необходимость в сценариях в среде баз данных Oracle;даже сценарии DDL должны запускаться с внешнего клиента, вероятно, инструмента сборки, такого как TeamCity.

В частности, я бы рассматривал попытку запуска сценария SQL из программы PL / SQL как архитектурный сбой.Что вы делаете со сценарием, который вы не можете сделать с хранимой процедурой?

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


Сказаввсе это, в реальном мире мы работаем с грязными архитектурами с взаимозависимостью между базой данных и внешней ОС.Итак, что мы можем сделать?

  1. Мы можем написать хранимую процедуру Java для выполнения команд оболочки.Это почтенное решение, появившееся со времен Oracle 8i. Узнайте больше .
  2. В 10g Oracle замените DBMS_JOB на DBMS_SCHEDULER.Одним из усовершенствований этого инструмента является его способность запускать внешние задания, например сценарии оболочки. Узнать больше .
  3. Поскольку внешние таблицы Oracle 11g R1 поддерживают сценарии препроцессора, которые перед выполнением запроса выполняют команды оболочки. Узнать больше .

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


Наконец, неясно, какую выгоду вы ожидаете от запуска сценария SQL в PL / SQL.Помните, что PL / SQL работает на сервере базы данных, поэтому не может видеть скрипты на клиентском компьютере .Это представляется уместным в свете требования принять пользовательский ввод.

Возможно, самое простое решение - это перенастройка исходного сценария.Выделите необходимый PL / SQL-вызов в блок, а затем просто вызовите именованный скрипт:

begin
   proc(para1,para2);
end;
/   
@prompt1.sql
4 голосов
/ 09 марта 2014

Вы можете написать блок pl / sql в SqlPlus, чтобы проверить параметр из таблицы, а затем выполнить скрипт. В скрипте, который должен быть выполнен (MyScript.sql ниже), терминаторы операторов должны быть ";" вместо "/"

    declare
    vMyParameter number := 0;  
    begin

    select count(*) into vMyParameter
    from MyTable
    where MyCheckValue = 'Y';

    if vMyParameter = 1 then
    @MyFolder/MyScript.sql;

    end if;
    end;
    /
2 голосов
/ 12 января 2012

Если вы используете sql * plus (или инструмент, который его использует), то вы можете сделать что-то вроде этого:

set serveroutput on
variable a number;
begin
:a := &promt;
dbms_output.put_line(:a);
end;
/

Если он работает в пакетном режиме, вы можете сделать:

variable a number;
begin
:a := &1;
dbms_output.put_line(:a);
end;

и получить значение для: a в качестве параметра-

sqlplus sdad/fdsfd@fdggd @<your_script.sql> <val_for_a>
1 голос
/ 07 октября 2012

Другой практикой является выполнение на одном *.bat с параметрами, такими как:

Пример c: /oracle/bin/sqlplus.exe -w @c: / name

sql% 1% 2 @c: /output.sql

0 голосов
/ 12 января 2012

выполнить немедленное 'start prompt1';

Немедленное выполнение - выполнение операторов SQL, а не произвольных команд.

могу ли я получить значение из prompt1 в мой блок PL / SQL, где я вызываю скрипт

Вы можете запустить скрипт запуска, но я сомневаюсь, что вы можете захватить ввод из сценария SQL, особенно в блоке PL / SQL

...