我有一个关于绑定变量可以在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;
/
我想知道你是否可以在这样的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 …我试图在动态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;
然后在客户端,我试图调用该过程:
Test_Pkg.Set_Nls_Calendar('Thai Buddha');
但这就是我ORA-02248: invalid option for ALTER SESSION.
我的问题是:为什么我不能在动态SQL中的DDL/SCL语句中使用绑定变量?
我正在尝试让这个动态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;
但是,在尝试运行时,我一直在努力
ORA-00903: Invalid table
P_TABLE_NAME是一个表名,可以作为输入接受.我已确认表名和列名有效.我无法弄清楚为什么Oracle会抛出错误.
FWIW将SQL语句更改为
M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 SEQ from :m_var2 RETURNING SEQ INTO :m_var3';
仍会导致相同的错误.
我想创建一个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();
我怎样才能进入image酒店?
我想为rowtype的字段赋值,但我不知道该怎么做.
假设我的数据库中有一个表X.
假设我还有以下变量
a  (X%ROWTYPE),表示表X的一行b  (VARCHAR2  ),包含表X的列名c  (VARCHAR2  ),包含我想要存储在ab中的内容我想做什么:像a.b := c.
我想出了这样的事情:
EXECUTE IMMEDIATE 'SELECT '|| c || ' INTO a.' || b || ' FROM DUAL';
显然,这不是正确的方法.我收到一个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;
只是想知道这是否是使用多个列和行执行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’;   
是什么:=在我们使用它时在oracle中的意思请给我一些演示...以及我们如何在oracle中的存储过程中通常使用动态查询...
我一直在浏览一些PL/SQL(在Oracle SQL Developer中),并且已经看到了几种不同格式的SQL被调用.
为了保证当前和未来代码的一致性和速度,我想知道哪个是首选.
我见过四种类型.
1)普通DDL:
CREATE TABLE newtable AS SELECT * FROM pSource;
2)执行立即(本机动态SQL):
statement := 'CREATE TABLE newtable AS SELECT * FROM ' || pSource;
EXECUTE IMMEDIATE statement;
3)EXEC_SQL:
EXEC_SQL('CREATE TABLE newtable AS SELECT * FROM ' || pSource);
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);
这些不同的呼叫方式之间是否有任何特定的优点/缺点/限制?
我是一个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;
它正常工作,所以在我执行一次之后,我在我的IF上添加了一条else语句:
ELSE
  insert into test (hello) values ('hi');
再次执行它,并在我的测试表中添加了一行.
好的,我的代码已经准备就绪,所以我删除了临时表并尝试再次运行整个语句,但是当我这样做时,我收到以下错误:
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" …我有一个问题,我在存储过程中使用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.
我创建的虚拟程序是:
create or replace procedure sp_dummy
   as
   begin
      execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
   end sp_dummy;
   /
详细错误:
ERROR at line 1:
ORA-01031: insufficient privileges …plsql ×8
oracle ×5
dynamic-sql ×2
oracle11g ×2
colon-equals ×1
database ×1
grant ×1
insert ×1
javascript ×1
oracle10g ×1
oracle12c ×1
scope ×1
sql ×1