简体   繁体   English

如何正确调用带有动态 SQL 的 PL/SQL function?

[英]How to properly call a PL/SQL function with dynamic SQL in it?

I wrote a PL/SQL function:-我写了一个 PL/SQL function:-

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;
/

But, I am not able to figure how to call it?但是,我不知道怎么称呼它? Calling within a select query doesn't work because the function has DML and DDL statements.在 select 查询中调用不起作用,因为 function 具有 DML 和 DDL 语句。

Calling using the following:-使用以下方式调用:-

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

shows the following error:-显示以下错误:-

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

Both the call and function are executed in same worksheet and as ADMIN.. Yet, it shows that the procedure is undefined.调用和 function 都在同一个工作表中以 ADMIN 的身份执行。但是,它表明该过程是未定义的。 Please help.请帮忙。 SQL Developer Web of Oracle Cloud is used.使用 Oracle 云的 SQL 开发者 Web。

Your function returns a number.您的 function 返回一个数字。 Call it in a pl/sql block where you assign the function to a variable of type number.在 pl/sql 块中调用它,在其中将 function 分配给 number 类型的变量。 The example below is a anonymous pl/sql block but you can also put this in a procedure of function.下面的示例是一个匿名 pl/sql 块,但您也可以将其放入 function 的过程中。

DECLARE
  l_driver_id NUMBER;
BEGIN
  l_driver_id := register_driver1('RoCK', 'wt893fdg$');
  -- rest of code ... --
END;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM