相关疑难解决方法(0)

为什么我不能在动态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万
查看次数

如何使用变量在动态查询中指定IN子句?

在PL/SQL中,您可以使用串联指定IN运算符的值:

v_sql := 'select field1
from table1
where field2 in (' || v_list || ')';
Run Code Online (Sandbox Code Playgroud)

是否可以使用变量执行相同的操作?

v_sql := 'select field1
from table1
where field2 in (:v_list)'; 
Run Code Online (Sandbox Code Playgroud)

如果是这样,怎么样?

编辑:参考Marcin的答案,我如何从结果表中选择?

declare

cursor c_get_csv_as_tables is
select in_list(food_list) food_list
from emp_food
where emp_type = 'PERM';

cursor c_get_food_list (v_food_table varchar2Table)is
select *
from v_food_table;

begin
    for i in c_get_csv_as_tables loop
        for j in c_get_food_list(i.food_list) loop
            dbms_output.put_line(j.element);
        end loop;
    end loop;
end;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ORA-06550: line 10, column 6:
PL/SQL: ORA-00942: table or view does not exist …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql dynamic-sql

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

从不存在的表中选择

我有一个关于ORACLE的问题,我编写了一个PLSQL代码来检查一个表是否存在,如果它存在,那么我从这个表中选择一些东西..pseudocode就像:

如果(表存在)从表中选择....

问题是,如果表不存在,我总是会收到错误,即使从不满足if条件并且从不执​​行select语句.

我认为这是因为我的代码在编译时被检查:"select from .."然后如果表不存在则会输出错误.我怎样才能解决这个问题?这里是我的代码的样子(我使用了通用名称):

     DECLARE
          v_table_exists NUMBER;
       BEGIN

          SELECT NVL(MAX(1), 0)
            INTO v_table_exists
            FROM ALL_TABLES
           WHERE TABLE_NAME = 'TABLE_TEST';

          IF v_table_exists = 1 THEN
             INSERT INTO MY_TABLE(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
             SELECT 1234,
                    5678,
                    T.COLUMN_TEST1,
                    T.COLUMN_TEST2


    FROM  TABLE_TEST T
          WHERE T.FLAG = 1;
      END IF;
   END;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

2
推荐指数
1
解决办法
988
查看次数

标签 统计

oracle ×3

plsql ×3

dynamic-sql ×2

sql ×2

execute-immediate ×1