标签: bind-variables

MySQL参数化查询

我很难使用MySQLdb模块将信息插入到我的数据库中.我需要在表中插入6个变量.

cursor.execute ("""
    INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
    VALUES
        (var1, var2, var3, var4, var5, var6)

""")
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这里的语法吗?

python mysql bind-variables

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

冒号在SQL查询中签名":"做什么?

什么是:代表在查询?

INSERT INTO MyTable (ID) VALUES (:myId)
Run Code Online (Sandbox Code Playgroud)

它如何获取所需的值?

编辑:那个标志叫什么?我想搜索谷歌,但名称是:什么?

sql oracle plsql bind-variables

44
推荐指数
6
解决办法
7万
查看次数

Python cx_Oracle绑定变量

我是一个Python新手,我在使用绑定变量时遇到了麻烦.如果我执行下面的代码一切正常.

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind"
cur.prepare(sql)
cur.execute(sql,bind)
Run Code Online (Sandbox Code Playgroud)

相反,如果我添加另一个绑定变量,我得到一个错误.

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind and otherfield = :bind"
cur.prepare(sql)
cur.execute(sql,(bind,bind))

cur.execute(sql,(bind,bind))
Oracle.NotSupportedError: Variable_TypeByValue(): unhandled data
Run Code Online (Sandbox Code Playgroud)

我用它解决了

cur.execute(sql,(bind["var"],bind["var"]))
Run Code Online (Sandbox Code Playgroud)

但我无法理解为什么以前的命令不行.

哪个是使用绑定变量的正确方法?我正在使用cx_Oracle.

python cx-oracle bind-variables

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

Oracle OCI,绑定变量和ID IN(1,2,3)之类的查询

简洁版:

我正在寻找以下Java技术的C++ OCI改编,其中代码能够将数组数组(数组大小可以变化)绑定到非PL/SQL SELECT语句中,然后在WHERE ID IN (...)样式检查中使用结果数组.

http://rafudb.blogspot.com/2011/10/variable-inlist.html

原始问题:

我们有一个C++应用程序通过OCI与Oracle通信.我们正在尝试修复通过连接文本生成SQL查询的旧代码; 相反,我们希望尽可能多地使用绑定变量.我们提出了一个特殊的案例,即我们没有一个好的解决方案.

SELECT * FROM MyTable WHERE ID IN (1, 4, 10, 30, 93)
Run Code Online (Sandbox Code Playgroud)

其中(1, 4, 10, 30, 93)一部分来自一个vector<int>或数据的其他一些灵活大小容器.如果我们知道它总是五个值,我们可以这样做:

SELECT * FROM MyTable WHERE ID IN (:1, :2, :3, :4, :5)
Run Code Online (Sandbox Code Playgroud)

但它可能是一个条目,或十个,甚至可能是零.显然,如果我们将查询构建为字符串,我们可以根据需要添加尽可能多的数字,但目标是尽可能避免这种情况并坚持只绑定变量.

有没有一个很好的方法来实现这一目标?例如,在OCI中,我可以绑定一个数组然后从中进行子选择吗?

SELECT * FROM MyTable WHERE ID IN (SELECT * FROM :1)
Run Code Online (Sandbox Code Playgroud)

:1OCI阵列在哪里?(可能语法不同.)有没有人有这方面的经验?示例代码将是天赐之物,因为我倾向于编写原始OCI.谢谢 :)

编辑:我想比在PL/SQL过程解析的字符串中绑定更好,如果可能的话.我相信在很多情况下我们会吹掉4000个字符的限制,而且我觉得这只是交易一种我很舒服的字符串操作,另一种我不是(我不能)调试很容易).如果可能的话,我想将一个值数组(或某种形式的数据集)绑定到一个标准SQL语句中.

编辑2:一些调查发现以下链接似乎正在做我想要的,但在Java:http: //rafudb.blogspot.com/2011/10/variable-inlist.html有谁知道如何适应这个处理C++ OCI?

c++ sql oracle oracle-call-interface bind-variables

11
推荐指数
1
解决办法
7604
查看次数

如何在PL/SQL中内联变量?

情况

对于Oracle 11.2.0.2.0中对大量数据进行中型查询的查询执行计划,我遇到了一些问题.为了加快速度,我引入了一个范围过滤器,其大致类似于:

PROCEDURE DO_STUFF(
    org_from VARCHAR2 := NULL,
    org_to   VARCHAR2 := NULL)

  -- [...]
  JOIN organisations org
    ON (cust.org_id = org.id
   AND ((org_from IS NULL) OR (org_from <= org.no))
   AND ((org_to   IS NULL) OR (org_to   >= org.no)))
  -- [...]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我想限制JOINorganisations使用数量组织的可选范围.客户端代码可以调用DO_STUFF(假设是快速)或没有(非常慢)限制.

麻烦

问题是,PL/SQL将为上面org_fromorg_to参数创建绑定变量,这在大多数情况下是我所期望的:

  -- [...]
  JOIN organisations org
    ON (cust.org_id = org.id
   AND ((:B1 IS NULL) OR (:B1 <= org.no))
   AND ((:B2 IS NULL) OR (:B2 >= org.no)))
  -- [...] …
Run Code Online (Sandbox Code Playgroud)

oracle plsql bind-variables sql-execution-plan

9
推荐指数
1
解决办法
2216
查看次数

使用绑定变量

我们可以在程序或函数中的oracle中使用绑定变量吗?

我正在尝试更新我的过程中的绑定变量.我可以这样做吗?

if (condition) then
    :v_bind:=10;
end if;
Run Code Online (Sandbox Code Playgroud)

我可以在程序或函数中执行上述操作吗?


variable v_bind number; 
create procedure abc as v_one 
BEGIN 
  select count(a) into v_one from ab; 
  if(v_one<>0) then 
     :v_bind:=10; 
  end if; 
Run Code Online (Sandbox Code Playgroud)

我能做到吗?它向我展示了糟糕的变数v_bind

oracle bind-variables

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

Oracle alter session查询的Java准备语句参数

我尝试执行 oracle alter session 查询来更改语言设置,但失败并出现错误“ORA-01036:非法变量名称/编号”。

preparedStatement = connection.prepareStatement("ALTER SESSION SET NLS_SORT = ?");

preparedStatement.setString(1, "BINARY_CI");

preparedStatement.execute();
Run Code Online (Sandbox Code Playgroud)

Oracle 不允许在 ddl 语句中绑定变量。由于绑定变量具有性能增益(在我的用例中,此更改会话查询将在 Web 应用程序中使用的每个连接上执行),并且它还可以防止应用程序遭受 SQL 注入,因此我想使用它们。如果没有绑定变量,是否还有其他优化方法来执行上述更改会话查询?

java oracle prepared-statement bind-variables

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

Oracle 绑定变量未正确使用索引的问题

在我的场景中,以下查询运行速度很快(在有 7000 万行的表上运行 0.5 秒):

select * from Purchases
where (purchase_id = 1700656396)
Run Code Online (Sandbox Code Playgroud)

而且,它甚至可以使用绑定变量快速运行:

var purchase_id number := 1700656396
select * from Purchases
where (purchase_id = :purchase_id)
Run Code Online (Sandbox Code Playgroud)

这些运行得很快,因为我在purchase_id列上有一个索引。(继续阅读...)

我需要创建一个允许对任意列进行“过滤”的查询。这意味着提供多个输入变量,并对每个变量进行过滤,除非它是null. 这起初工作正常。

例如,以下查询也运行得很快(0.5 秒):

select * from Purchases
where (1700656396 IS NULL OR purchase_id    = 1700656396)
and   (NULL       IS NULL OR purchase_name  = NULL)
and   (NULL       IS NULL OR purchase_price = NULL)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试通过绑定变量或存储过程参数化查询时,查询速度显着减慢(1.5 分钟),就好像它忽略了任何索引:

var purchase_id    number   := 1700656396
var purchase_name  varchar2 := NULL
var purchase_price number   := …
Run Code Online (Sandbox Code Playgroud)

oracle indexing parameterized-query bind-variables oracle11gr1

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

Oracle-在动态游标的LIKE子句中使用绑定变量

我正在使用动态光标来获取数据。正在执行的查询类似于:

query := 'SELECT column1, column2 
          FROM my_table 
          WHERE column1 LIKE ''%:bv1%''';
Run Code Online (Sandbox Code Playgroud)

游标本身是这样执行的:

OPEN my_cursor FOR query USING my_var1;
Run Code Online (Sandbox Code Playgroud)

我也尝试检查查询并打印它:

... WHERE column1 LIKE '%:bv1%' ...
Run Code Online (Sandbox Code Playgroud)

因此省略了撇号,但光标没有获取任何数据。甚至可以在LIKE子句中使用绑定变量,如果可以,我做错了什么?

oracle dynamic-sql cursor bind-variables

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

为什么dbms_sql.parse包含带有绑定变量的错误PL/SQL块意外成功?

下面的PL/SQL块按预期失败:

SQL> declare
  2    i int;
  3  begin
  4    i := dbms_sql.open_cursor;
  5    dbms_sql.parse(i,'begin dontexist; dbms_output.put(''a''); end;',1);
  6    dbms_sql.close_cursor(i);
  7  end;
  8  /
declare
*
FOUT in regel 1:
.ORA-06550: Regel 1, kolom 7:
PLS-00201: identifier 'DONTEXIST' must be declared.
ORA-06550: Regel 1, kolom 7:
PL/SQL: Statement ignored.
ORA-06512: in "SYS.DBMS_SQL", regel 1120
ORA-06512: in regel 5
Run Code Online (Sandbox Code Playgroud)

因为我没有名为DONTEXIST的程序.我的问题是为什么下一个PL/SQL块成功完成?

SQL> declare
  2    i int;
  3  begin
  4    i := dbms_sql.open_cursor;
  5    dbms_sql.parse(i,'begin dontexist; dbms_output.put(:a); end;',1);
  6    dbms_sql.close_cursor(i);
  7  end;
  8  / …
Run Code Online (Sandbox Code Playgroud)

oracle plsql bind-variables

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