Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> НЕ DML инструкции в процедурах и функциях, поделитесь опытом в написании процедур 
:(
    Опции темы
BIZ0N
  Дата 8.6.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



Субд Oracle 9i или Oracle 10g XE Release 10.2.0.1.0

Как реализовать нечто подобное вот этому:

Код

-- Декларация пакета
CREATE OR REPLACE PACKAGE my_package IS

   PROCEDURE new_user (uname in sys.dba_users.username%TYPE, upass in sys.dba_users.username%TYPE);
    
END my_package;
/
-- Конец

Код

-- Описание пакета
CREATE OR REPLACE PACKAGE BODY my_package IS

   -- Процедура создания нового пользователя
   PROCEDURE new_user (uname in sys.dba_users.username%TYPE, upass in sys.dba_users.username%TYPE)
   IS
   BEGIN
      
      CREATE USER uname
      IDENTIFIED BY upass
      PROFILE my_profile;

      GRANT "CONNECT" TO uname;
      GRANT EXECUTE ON  "my_sheme"."my_package" TO uname;

   END new_user;
   -- Конец процедуры

END my_package;
/
-- Конец


 smile 

P.S.: Заранее спасибо!!!  

Это сообщение отредактировал(а) BIZ0N - 8.6.2006, 20:39
PM MAIL   Вверх
Sqlninja
Дата 8.6.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Код

   PROCEDURE new_user (
      uname        IN   SYS.dba_users.username%TYPE
    , upass        IN   SYS.dba_users.username%TYPE
    , my_sheme     IN   VARCHAR2
    , my_package   IN   VARCHAR2
   )
   IS
   BEGIN
      EXECUTE IMMEDIATE 'CREATE USER ' || uname || ' IDENTIFIED BY ' || upass || ' PROFILE my_profile';

      EXECUTE IMMEDIATE 'GRANT CONNECT TO ' || uname;

      EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || my_sheme || '.' || my_package || ' TO ' || uname;
   END new_user;

 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
batigoal
Дата 9.6.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Кстати, а я вроде слышал, что EXECUTE IMMEDIATE не следует злоупотреблять. Из-за чего? Из соображений производительности, или целостности, или еще каких-то?.. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Sqlninja
Дата 9.6.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Динамический SQL - это в общем не есть хорошо, но он имеет и свои преймущества. Основные недостатки  - это невозможность проверки на этапе компиляции и, как правило, худшая производительность. Кстати, EXECUTE IMMEDIATE это еще ничего, в ранних версиях был только тормозной пакет DMBS_SQL.
Общее правило таково, что динамический SQL следует использовать лишь тогда когда невозможно обойтись статическим, как например в этом случае. А также:

- при выполнении DDL операторов в PL\SQL
- при ссылках на объекты не существующие на этапе компиляции
- при выполнении динамических запросов или блоков
- при динамических операциях с правами вызывающего

Кажется, все. 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
batigoal
Дата 9.6.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Ясно, спасибо 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
chief39
Дата 13.9.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



Осмелюсь поднять старую тему, дабы избежать криков "поиск рулит!!" smile

Возникло подозрение, что DDL через execute immediate нельзя выполнять...

Но раз уж в топике так написано....
Делюсь тем, что есть:

Выполняю из консоли тоада
Код

create user new_user identified by new_user; 

Сервер пишет:
Код

User created.


Всё ок.

Но надо динамически...
И тут валится в самом простом кейсе:
вот так:
Код

execute immediate ' create user new_user identified by new_user; ';

Код

ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol " create user new_user identified by new_user; " when expecting one of the following:

   := . ( @ % ;
The symbol ":=" was substituted for " create user new_user identified by new_user; " to continue.


вот так:
Код

DBMS_SQL.EXECUTE(' create user new_user identified by new_user; ');

Код

ORA-00900: invalid SQL statement


В том числе и если не писать ";" в самом стринге запроса.

оракл - 10.1.0

Голова не варит совершенно, посему очень полагаюсь на помощь smile)



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 13.9.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Ты чегой-то перемудрил в процедуре.
Код
create or replace procedure CREATE_USER is
begin
  execute immediate 'create user new_user identified by new_user';
end CREATE_USER;
/

нормально отрабатывает, только не надо забывать про то что привилегию create user надо выдать явно, а не через роль.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 14.9.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



Цитата(LSD @  13.9.2006,  20:13 Найти цитируемый пост)
Ты чегой-то перемудрил в процедуре.

Это не процедура - это неименованый кусок кода. скриптяра.

Цитата(LSD @  13.9.2006,  20:13 Найти цитируемый пост)
нормально отрабатывает, только не надо забывать про то что привилегию create user надо выдать явно, а не через роль. 

я под sys as sysdba это делаю... просто так создаёт нормально smile

Добавлено @ 12:32 
LSD, если создавать процедурой - отрабатывает....

Блин.. создавать процедуру  для создания юзеров... кампилец....
 smile 

без процедурной оболочки не пашет smile

Придётся в начале скрипта создавать процедуру
и в конце дропать.

КРИК К ЗВЁЗДАМ: НУ ЧЁ ЗА ХЕРНЯ?!?!?! ( Откуда такая несправедливость?)


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
chief39
Дата 14.9.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



ЗЫ: не совсем в тему, но...

Инициализация таблиц согласно мануалам должна проходить вот так:

Код

declare
       TYPE mylist IS TABLE OF varchar(20) INDEX BY BINARY_INTEGER;
       modules mylist := mylist('prebillling');
       users mylist;
       
begin

bla-bla...


Но... 
Код


ORA-06550: line 3, column 24:
PLS-00222: no function with name 'MYLIST' exists in this scope
ORA-06550: line 3, column 13:
PL/SQL: Item ignored
ORA-06550: line 62, column 15:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 62, column 3:
PL/SQL: Statement ignored
ORA-06550: line 71, column 17:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 71, column 5:
PL/SQL: Statement ignored


Подумалось - а вдруг фигурные? - но, фик.
Если поэлементно инициализировать потом - один елемент пролеает - при переборе ругается

Добавлено @ 13:06 
В принципе сделал, но вопросы всё равно для меня интересные smile

Да простят меня "оракулы", по после сибейса очччень неудобная штука smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 14.9.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(chief39 @  14.9.2006,  13:18 Найти цитируемый пост)
Это не процедура - это неименованый кусок кода. скриптяра.

Зачем тебе в скрипте понадобилось execute immediate? Там же и без этого можно выполнять операторы DDL?
Да и как анонимный PL/SQL блок
Код
begin
  execute immediate 'create user new_user identified by new_user';
end CREATE_USER;
/

оно отрабатывает нормально.

Цитата(chief39 @  14.9.2006,  13:52 Найти цитируемый пост)
Инициализация таблиц согласно мануалам должна проходить вот так:
...

Не понял, поподробней в чем проблема?


Цитата(chief39 @  14.9.2006,  13:18 Найти цитируемый пост)
КРИК К ЗВЁЗДАМ: НУ ЧЁ ЗА ХЕРНЯ?!?!?! ( Откуда такая несправедливость?)

Тссс! Не шуми, а то сюда сейчас вся "Фабрика звезд" нагрянет smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 14.9.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



Цитата(LSD @  14.9.2006,  13:23 Найти цитируемый пост)
Зачем тебе в скрипте понадобилось execute immediate? Там же и без этого можно выполнять операторы DDL?

Создаётся много схем. Названия формируются динамически.

Цитата(LSD @  14.9.2006,  13:23 Найти цитируемый пост)
Да и как анонимный PL/SQL блок

Цитата(LSD @  14.9.2006,  13:23 Найти цитируемый пост)
оно отрабатывает нормально.

У меня валится smile Как выше описано smile

Цитата(LSD @  14.9.2006,  13:23 Найти цитируемый пост)
Не понял, поподробней в чем проблема?

Ну... в коде есть. Пытаюсь создать и сразу проинициализировать список.
Но валится

Цитата(LSD @  14.9.2006,  13:23 Найти цитируемый пост)
Тссс! Не шуми, а то сюда сейчас вся "Фабрика звезд" нагрянет

Эттто ещё кто??? 



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 14.9.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(chief39 @  14.9.2006,  14:37 Найти цитируемый пост)
У меня валится  Как выше описано

Мой тестовый пример, или твой?

Цитата(chief39 @  14.9.2006,  14:37 Найти цитируемый пост)
Ну... в коде есть. Пытаюсь создать и сразу проинициализировать список.

Прям в секции объявления smile 
Так нельзя. В секции объявления, переменные только объявляются, иниализация в блоке кода.


Цитата(chief39 @  14.9.2006,  14:37 Найти цитируемый пост)
Эттто ещё кто???

Страшные люди, умеют своим пением сводить людей с ума: люди начинают биться головой о стену, у них начинаются приступы тошноты и беспричинной агресси.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 14.9.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



Цитата(LSD @  14.9.2006,  13:51 Найти цитируемый пост)
Мой тестовый пример, или твой?

Блин... если бегин-эндом обрамить - пашет smile

С меня пиво smile)) Белое, ессно  smile 



Цитата(LSD @  14.9.2006,  13:51 Найти цитируемый пост)
Прям в секции объявления smile 
Так нельзя. В секции объявления, переменные только объявляются, иниализация в блоке кода.

А вот  ТУТ говорили что можно smile
Код

 DECLARE

TYPE clientele IS TABLE OF VARCHAR2(64);
group1 clientele := clientele('Customer 1', 'Customer 2');
group2 clientele := clientele('Customer 1', 'Customer 3');

BEGIN

Я и поверил было... smile



Цитата(LSD @  14.9.2006,  13:51 Найти цитируемый пост)
Страшные люди, умеют своим пением сводить людей с ума: люди начинают биться головой о стену, у них начинаются приступы тошноты и беспричинной агресси.

Это из какого-то анека? Или фэнтези? Что за фабрика звёзд?


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 14.9.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(chief39 @  14.9.2006,  15:21 Найти цитируемый пост)
А вот  ТУТ говорили что можно

Ээээ, ты туда не читай, ты сюда читай, а то савсэм обманут будешь smile

Цитата(chief39 @  14.9.2006,  15:21 Найти цитируемый пост)
С меня пиво )) Белое, ессно

Неа, черное (Гиннес) smile 

Цитата(chief39 @  14.9.2006,  15:21 Найти цитируемый пост)
Это из какого-то анека? Или фэнтези? Что за фабрика звёзд?

Счастливый человек, не знает что такое Фабрика звезд (на МузТВ очень интересный факт показали, рядом с Фабрикой Звезд находится завод по производству слуховых аппаратов smile ).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 14.9.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



Цитата(LSD @  14.9.2006,  14:45 Найти цитируемый пост)
Неа, черное (Гиннес)

Ок ;) Приезжай smile




Цитата(LSD @  14.9.2006,  14:45 Найти цитируемый пост)
Ээээ, ты туда не читай, ты сюда читай, а то савсэм обманут будешь


Код

declare
       TYPE mylist IS TABLE OF varchar(20) INDEX BY BINARY_INTEGER;
       modules mylist;
       users mylist;
       
begin

     modules := mylist('prebilling','huilling');

blaaaaaaa....


Код

 ORA-06550: line 12, column 14:
PLS-00222: no function with name 'MYLIST' exists in this scope
ORA-06550: line 12, column 3:
PL/SQL: Statement ignored

smile Тэм нэ мэнэе.. smile

Цитата(LSD @  14.9.2006,  14:45 Найти цитируемый пост)
Фабрика звезд 

Мдя smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.