标签: execute-immediate

在PL/SQL中使用绑定变量和动态SELECT INTO子句

我有一个关于绑定变量可以在PL/SQL中的动态SQL语句中使用的问题.

例如,我知道这是有效的:

CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2) 
RETURN NUMBER
IS
  v_query_str VARCHAR2(1000);
  v_num_of_employees NUMBER;
BEGIN
  v_query_str := 'SELECT COUNT(*) FROM emp_' 
                 || p_loc
                 || ' WHERE job = :bind_job';                           
  EXECUTE IMMEDIATE v_query_str
    INTO v_num_of_employees
    USING p_job;
  RETURN v_num_of_employees;
END;
/
Run Code Online (Sandbox Code Playgroud)

我想知道你是否可以在这样的select语句中使用绑定变量

CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2) 
RETURN NUMBER
IS
  v_query_str VARCHAR2(1000);
  v_num_of_employees NUMBER;
BEGIN
  v_query_str := 'SELECT COUNT(*) INTO :into_bind FROM emp_' 
                 || p_loc
                 || ' WHERE job = :bind_job';                           
  EXECUTE IMMEDIATE …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql oracle11g execute-immediate

42
推荐指数
3
解决办法
23万
查看次数

为什么我不能在动态SQL中的DDL/SCL语句中使用绑定变量?

我试图在动态SQL中使用绑定变量执行SQL命令:

-- this procedure is a part of PL/SQL package Test_Pkg
PROCEDURE Set_Nls_Calendar(calendar_ IN VARCHAR2)
IS
BEGIN
   EXECUTE IMMEDIATE
      'ALTER SESSION
      SET NLS_CALENDAR = :cal'
      USING IN calendar_;
END Set_Nls_Calendar;
Run Code Online (Sandbox Code Playgroud)

然后在客户端,我试图调用该过程:

Test_Pkg.Set_Nls_Calendar('Thai Buddha');
Run Code Online (Sandbox Code Playgroud)

但这就是我ORA-02248: invalid option for ALTER SESSION.

我的问题是:为什么我不能在动态SQL中的DDL/SCL语句中使用绑定变量?

oracle plsql dynamic-sql execute-immediate

14
推荐指数
1
解决办法
1万
查看次数

使用带有绑定变量的Execute Immediate语句时,表名称错误无效

我正在尝试让这个动态SQL运行(使用EXECUTE IMMEDIATE)

M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 from :m_var2 RETURNING MAX(:m_var1)+1 INTO :m_var3';

EXECUTE IMMEDIATE M_SQL_STATEMENT
   USING M_COLUMN_NAME, UPPER(P_TABLE_NAME), M_COLUMN_NAME
   RETURNING INTO M_SEQ_NUMBER;
Run Code Online (Sandbox Code Playgroud)

但是,在尝试运行时,我一直在努力

ORA-00903: Invalid table
Run Code Online (Sandbox Code Playgroud)

P_TABLE_NAME是一个表名,可以作为输入接受.我已确认表名和列名有效.我无法弄清楚为什么Oracle会抛出错误.

FWIW将SQL语句更改为

M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 SEQ from :m_var2 RETURNING SEQ INTO :m_var3';
Run Code Online (Sandbox Code Playgroud)

仍会导致相同的错误.

plsql dynamic-sql oracle10g execute-immediate

5
推荐指数
1
解决办法
6103
查看次数

立即自动执行功能和"这个"

我想创建一个javascript库,所以我认为使它成为一个立即自动执行的功能,确保范围安全和一切都是一件好事.

但是现在我遇到了使用我不太了解的"this"关键字的问题.

如何使这样的代码正常工作?目前,它告诉我"图像"未定义.

(function() {

    function lib() {
        this.image = document.getElementById("image");
        this.parts = [
            {name: "part1", num: "1"}
        ];

        this.init = function() {
            $(parts).each(function() {
                var partNum = this.num;
                image.getElementById(partNum).addEventListener("click", function() {
                    toggleHighlight(partNum);
                }, true);
            });
        };
    }

    window.lib = new lib();
})();

window.lib.init();
Run Code Online (Sandbox Code Playgroud)

我怎样才能进入image酒店?

javascript scope execute-immediate

5
推荐指数
1
解决办法
413
查看次数

将值赋给rowtype字段,其中`field name`是一个字符串

我想为rowtype的字段赋值,但我不知道该怎么做.

假设我的数据库中有一个表X.

假设我还有以下变量

  • a (X%ROWTYPE),表示表X的一行
  • b (VARCHAR2 ),包含表X的列名
  • c (VARCHAR2 ),包含我想要存储在ab中的内容

我想做什么:a.b := c.

我想出了这样的事情:

EXECUTE IMMEDIATE 'SELECT '|| c || ' INTO a.' || b || ' FROM DUAL';
Run Code Online (Sandbox Code Playgroud)

显然,这不是正确的方法.我收到一个ORA-0095:丢失关键字错误.

谁能帮我这个 ?

这是完整的代码:

DECLARE
    tRow            MyTable%ROWTYPE;
    col_name        VARCHAR(10) := 'Length';
    nValue          NUMBER(12,4) := 0.001;
    dynamic_request VARCHAR(300);
BEGIN 
    dynamic_request := 'SELECT '|| nValue || ' INTO tRow.' || col_name || ' FROM DUAL';
    EXECUTE IMMEDIATE dynamic_request;
END;
Run Code Online (Sandbox Code Playgroud)

plsql execute-immediate

5
推荐指数
1
解决办法
3272
查看次数

EXECUTE IMMEDIATE,要插入多行列

只是想知道这是否是使用多个列和行执行EXECUTE IMMEDIATE并将其分配给变量的正确方法?我试着查看示例,但不确定我是否正确连接线条?

sql_stmt        VARCHAR2(200);

sql_stmt:='INSERT INTO (STORECODE, TILLID, TRANSACTIONNR, TRADINGDATE, TRANSTYPE, ' ||
          'OPERATORCODE TRAININGMODE, VOIDED, VALUEGROSS, VALUENETT, VALUEDUE) ' ||
          ‘VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10)’;
          EXECUTE IMMEDIATE sql_stmt USING sSTORECODE………………………………………..fGROSS_AMOUNT,
      ‘0’;   
Run Code Online (Sandbox Code Playgroud)

plsql insert concatenation execute-immediate

4
推荐指数
1
解决办法
1万
查看次数

什么:=我们使用它时在oracle中的意思

是什么:=在我们使用它时在oracle中的意思请给我一些演示...以及我们如何在oracle中的存储过程中通常使用动态查询...

oracle execute-immediate colon-equals

4
推荐指数
1
解决办法
1万
查看次数

EXEC_SQL,EXECUTE IMMEDIATE,DBMS_SQL和内联SQL之间的区别

我一直在浏览一些PL/SQL(在Oracle SQL Developer中),并且已经看到了几种不同格式的SQL被调用.

为了保证当前和未来代码的一致性和速度,我想知道哪个是首选.

我见过四种类型.

1)普通DDL:

CREATE TABLE newtable AS SELECT * FROM pSource;
Run Code Online (Sandbox Code Playgroud)

2)执行立即(本机动态SQL):

statement := 'CREATE TABLE newtable AS SELECT * FROM ' || pSource;
EXECUTE IMMEDIATE statement;
Run Code Online (Sandbox Code Playgroud)

3)EXEC_SQL:

EXEC_SQL('CREATE TABLE newtable AS SELECT * FROM ' || pSource);
Run Code Online (Sandbox Code Playgroud)

4)DBMS_SQL:

cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor, 'CREATE TABLE newtable AS SELECT * FROM ' || pSource, DBMS_SQL.NATIVE);
numRows := DBMS_SQL.EXECUTE(cursor);
Run Code Online (Sandbox Code Playgroud)

这些不同的呼叫方式之间是否有任何特定的优点/缺点/限制?

oracle plsql execute-immediate oracle-sqldeveloper

4
推荐指数
1
解决办法
1万
查看次数

为什么这里需要EXECUTE IMMEDIATE?

我是一个SQL Server用户,我有一个小项目要使用Oracle,所以我试图了解Oracle的一些特性,我认为我需要一些帮助来更好地理解以下情况:

我想在创建之前测试一个临时表是否存在,所以我在这里有这个代码:

DECLARE
  table_count INTEGER;
  var_sql VARCHAR2(1000) := 'create GLOBAL TEMPORARY table TEST (
            hello varchar(1000) NOT NULL)';
BEGIN
  SELECT COUNT(*) INTO table_count FROM all_tables WHERE table_name = 'TEST';

  IF table_count = 0 THEN
    EXECUTE IMMEDIATE var_sql;
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

它正常工作,所以在我执行一次之后,我在我的IF上添加了一条else语句:

ELSE
  insert into test (hello) values ('hi');
Run Code Online (Sandbox Code Playgroud)

再次执行它,并在我的测试表中添加了一行.

好的,我的代码已经准备就绪,所以我删除了临时表并尝试再次运行整个语句,但是当我这样做时,我收到以下错误:

ORA-06550: line 11, column 19:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 11, column 7:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s" …
Run Code Online (Sandbox Code Playgroud)

oracle plsql execute-immediate oracle12c

4
推荐指数
1
解决办法
896
查看次数

即使使用CREATE表grant,Execute Immediate也会失败

我有一个问题,我在存储过程中使用execute immediate命令创建一个表.但是我得到了"权限不足"的错误.我检查了其他线程并确保用户具有授予它的"CREATE TABLE"权限.但是我仍然看到同样的错误.

SQL> select * from USER_SYS_PRIVS;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER            CREATE VIEW                              NO
MYUSER            UNLIMITED TABLESPACE                     NO

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

11 rows selected.
Run Code Online (Sandbox Code Playgroud)

我创建的虚拟程序是:

create or replace procedure sp_dummy
   as
   begin
      execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
   end sp_dummy;
   /
Run Code Online (Sandbox Code Playgroud)

详细错误:

ERROR at line 1:
ORA-01031: insufficient privileges …
Run Code Online (Sandbox Code Playgroud)

database plsql grant oracle11g execute-immediate

4
推荐指数
3
解决办法
2万
查看次数