Как правильно вызвать функцию PL / SQL с Dynami c SQL в ней? - PullRequest
0 голосов
/ 29 апреля 2020

Я написал функцию PL / SQL: -

CREATE OR REPLACE FUNCTION register_driver1(driver_name IN VARCHAR, pass_word IN VARCHAR) RETURN NUMBER AS
sql_stmt VARCHAR2(200);
driver_id NUMBER;
new_view_name VARCHAR(50);
BEGIN

    sql_stmt := 'CREATE USER '||driver_name||' identified by '||pass_word;

    EXECUTE IMMEDIATE sql_stmt;

    sql_stmt := 'grant create session to '||driver_name;

    EXECUTE IMMEDIATE sql_stmt;

    driver_id := driver_ids.nextval;
    new_view_name := 'vehicle_'||driver_name;

    sql_stmt := 'CREATE VIEW '||new_view_name|| ' AS SELECT Model, Seats, reg_no FROM Vehicle WHERE(d_id='||driver_id||')';

    EXECUTE IMMEDIATE sql_stmt;

    sql_stmt := 'CREATE OR REPLACE TRIGGER reg_vehicle 
                 INSTEAD OF INSERT ON '||new_view_name||
               ' FOR EACH ROW 
                 DECLARE 
                 vehicle_id NUMBER;
                 BEGIN
                 vehicle_id := vehicle_ids.nextval
                 INSERT INTO Vehicles VALUES(:NEW.Model, :NEW.Seats, :NEW.reg_no, vehicle_id, '||driver_id||');
                 END;';

    EXECUTE IMMEDIATE sql_stmt;

    sql_stmt := 'grant insert, update, select, delete on '||new_view_name||' to '||driver_name;  

    EXECUTE IMMEDIATE sql_stmt;

    sql_stmt := 'grant select on PENDING_REQUESTS to '||driver_name;

    EXECUTE IMMEDIATE sql_stmt;

    RETURN driver_id;

END register_driver1;
/

Но я не могу понять, как это назвать? Вызов в запросе выбора не работает, потому что функция имеет операторы DML и DDL.

Вызов с использованием следующего: -

BEGIN
  register_driver1('RoCK', 'wt893fdg$');
END;
/

показывает следующую ошибку: -

Function REGISTER_DRIVER1 compiled

Elapsed: 00:00:00.009

ORA-06550: line 2, column 3: PLS-00221: 'REGISTER_DRIVER1' is not a procedure or is undefined ORA-06550: line 2, column 3: PL/SQL: Statement ignored

И вызов, и функция выполняются в одном листе и в ADMIN. Тем не менее, это показывает, что процедура не определена. Пожалуйста помоги. SQL Разработчик Web из Oracle Используется облако.

1 Ответ

3 голосов
/ 29 апреля 2020

Ваша функция возвращает число. Вызовите блок pl / sql, в котором вы присваиваете функцию переменной типа number. Пример ниже представляет собой анонимный блок pl / sql, но вы также можете поместить это в процедуру функции.

DECLARE
  l_driver_id NUMBER;
BEGIN
  l_driver_id := register_driver1('RoCK', 'wt893fdg$');
  -- rest of code ... --
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...