powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подстановка в SELECT (маразм крепчает)
6 сообщений из 6, страница 1 из 1
Подстановка в SELECT (маразм крепчает)
    #32022364
По совету некоторых гуру начал копать пакет DBMS_SQL, дабы насладиться его фичами под Oracle 8. Сделал небольшой пример с функциями DBMS_SQL.OPEN_CURSOR, DBMS_SQL.PARSE и пр.
С первой попытки компилятор пнул меня с воплем, что "не гарантируется, что ваша функция не изменить БД". Начал копать, куда вставить строчку с прагмой PRAGMA RESTRICT_REFERENCES (< имячко>, WNDS). Пришлось создать свой пакет с егойным телом. Package Spec. выглядит так -

PACKAGE svr_sql
IS
FUNCTION kill_sql(fk_id_in IN INTEGER, fk_table_in IN VARCHAR2, fk_id_col_in IN VARCHAR2, fk_nm_col_in IN VARCHAR2)
return varchar2;
PRAGMA RESTRICT_REFERENCES (kill_sql,WNDS);
END;

Вышеуказаный код спокойно принимается и сохраняется посредством SQL Navigator.
А тело пакета выглядит как -

PACKAGE BODY svr_sql
IS
FUNCTION KILL_SQL
(fk_id_in IN INTEGER,
fk_table_in IN VARCHAR2,
fk_id_col_in IN VARCHAR2,
fk_nm_col_in IN VARCHAR2)
RETURN VARCHAR2
IS
cur INTEGER := DBMS_SQL.OPEN_CURSOR;
fdbk INTEGER;
return_value VARCHAR2(100) := NULL;
BEGIN
DBMS_SQL.PARSE
(cur,
'SELECT ' || fk_nm_col_in ||
' FROM ' || fk_table_in ||
' WHERE ' || fk_id_col_in || ' = :fk_value',
DBMS_SQL.V7);
DBMS_SQL.BIND_VARIABLE (cur, 'fk_value', fk_id_in);
DBMS_SQL.DEFINE_COLUMN (cur, 1, fk_nm_col_in, 100);
fdbk := DBMS_SQL.EXECUTE (cur);
fdbk := DBMS_SQL.FETCH_ROWS (cur);
IF fdbk > 0
THEN
DBMS_SQL.COLUMN_VALUE (cur, 1, return_value);
END IF;
DBMS_SQL.CLOSE_CURSOR (cur);
RETURN return_value;
END;

END;

При попытке сохранить данное тело, SQL Navigator орет, что
"PLS-00452: Подпрограмма KILL_SQL нарушает свою прагму".
Никакие развлечения с прагмой (WNDS, WNPS...) толку не дают.
Как победить гада ?
...
Рейтинг: 0 / 0
Подстановка в SELECT (маразм крепчает)
    #32022368
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что если ты используешь пакет DBMS_SQL то прагма не нужна, т.е.
ты говоришь что функция может делать что угодно.
Но с такую функцию нельзя использовать в операторе select,
поэтому DBMS_SQL скорее всего тебя не спасет.
...
Рейтинг: 0 / 0
Подстановка в SELECT (маразм крепчает)
    #32022369
>Дело в том, что если ты используешь пакет DBMS_SQL то прагма не нужна, т.е.
>ты говоришь что функция может делать что угодно.
>Но с такую функцию нельзя использовать в операторе select,
>поэтому DBMS_SQL скорее всего тебя не спасет.

Чего-то я не понял, откуда ноги растут. Во-первых, где это сказано, что при использовании DBMS_SQL в своих функциях прагма не нужна ? Во-вторых, когда пишется свой Package Body, еще не известно, где и как в будущем я собираюсь использовать функции своего пакета (в SELECTe, в INSERTe, с пивом или без . Так что, обьяснение не прокатывает.
...
Рейтинг: 0 / 0
Подстановка в SELECT (маразм крепчает)
    #32022376
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отсутствие прагмы означает, что данная функция может писать/читать в/из БД и пакет/а.
И если ты посмотриж на то как описаны функции из DBMS_SQL (например parse), то поймешь,
что прагма для функций, использующих DBMS_SQL не нужна, т.к. для них допустимо любое действие.
Все это следует из правил наследования прагмы.
В операторе select можно использовать только те функции которые не меняют состояния пакета и таблиц.
...
Рейтинг: 0 / 0
Подстановка в SELECT (маразм крепчает)
    #32022429
Johnny Smith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей, функции с использованием DBMS_SQL доступны в DML-выражениях только в Oracle версий не ниже 8i.
...
Рейтинг: 0 / 0
Подстановка в SELECT (маразм крепчает)
    #32023058
Goor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PARGMA устанавливает уровень строгости, для его выполнения должно собдюдаться условие. Из любой функции/процедуры, с заданым уровнем строгости, не может быть вызвана функция/процедура с уровнем строгости ниже. У DBMS_SQL уровень строгости самый низкий. Последствия понятны
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подстановка в SELECT (маразм крепчает)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]