我有一个关于绑定变量可以在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中使用绑定变量执行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语句中使用绑定变量?
我正在尝试让这个动态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)
仍会导致相同的错误.
我想创建一个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酒店?
我想为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) 只是想知道这是否是使用多个列和行执行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) 是什么:=在我们使用它时在oracle中的意思请给我一些演示...以及我们如何在oracle中的存储过程中通常使用动态查询...
我一直在浏览一些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)
这些不同的呼叫方式之间是否有任何特定的优点/缺点/限制?
我是一个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) 我有一个问题,我在存储过程中使用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) 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