Nano Hash - криптовалюты, майнинг, программирование

Получить значение из файла sql в вызывающий файл sql

У меня есть file1.sql, который вызывает file2.sql.

файл2.sql:

declare
v_stmt varchar2(1000);
begin
v_stmt := 'create index idx on tab1(&1)';
:stmt  := v_stmt;
end;
/

файл1.sql:

var stmt varchar2(4000);
@file2.sql 'col1'
:stmt;

Выполнение file1.sql вызывает следующие ошибки:

SP2-0552: Bind variable "STMT" not declared.  
SP2-0042: unknown command ":stmt" - rest of line ignored.

Как получить значение переменной v_stmt в file1.sql?

20.12.2018

  • Вы не должны получать SP2-0552 из того, что вы показали, эта переменная связывания существует и заполняется. Я не вижу этого, когда создаю и запускаю оба файла, как вы их показали. 20.12.2018

Ответы:


1

Вы не можете запустить произвольный код из командной строки SQL*Plus, используя переменную связывания; переменная связывания имеет отношение к операторам SQL и PL/SQL, а не к SQL*Plus изначально (даже несмотря на то, что она объявлена ​​там с var).

Чтобы выполнить оператор, вам нужно будет использовать динамический SQL в анонимном блоке PL/SQL; поэтому меняем file1.sql на:

var stmt varchar2(4000);
@file2.sql 'col1'

begin
  execute immediate :stmt;
end;
/

или немного короче, но тоже, возможно, немного запутанно::

var stmt varchar2(4000);
@file2.sql 'col1'
exec execute immediate :stmt;

Когда я запускаю это, я вижу:

SQL> @file1

PL/SQL procedure successfully completed.

begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2

что разумно, поскольку у меня нет вашей таблицы tab1 в моей схеме. Вы можете видеть, что это пытается выполнить оператор; и нет ошибки SP2-0552 (хотя я не вижу этого и в вашем исходном коде).

Вы также можете использовать print stmt, чтобы увидеть сгенерированное значение перед его запуском (обратите внимание, что префикс двоеточия отсутствует); или, конечно, вы можете использовать dbms_output в анонимном блоке.

20.12.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..