我很难使用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)
有人可以帮我解决这里的语法吗?
什么是:代表在查询?
INSERT INTO MyTable (ID) VALUES (:myId)
Run Code Online (Sandbox Code Playgroud)
它如何获取所需的值?
编辑:那个标志叫什么?我想搜索谷歌,但名称是:什么?
我是一个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.
简洁版:
我正在寻找以下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?
对于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)
正如你所看到的,我想限制JOIN的organisations使用数量组织的可选范围.客户端代码可以调用DO_STUFF(假设是快速)或没有(非常慢)限制.
问题是,PL/SQL将为上面org_from和org_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中使用绑定变量吗?
我正在尝试更新我的过程中的绑定变量.我可以这样做吗?
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 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 注入,因此我想使用它们。如果没有绑定变量,是否还有其他优化方法来执行上述更改会话查询?
在我的场景中,以下查询运行速度很快(在有 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
我正在使用动态光标来获取数据。正在执行的查询类似于:
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子句中使用绑定变量,如果可以,我做错了什么?
下面的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) bind-variables ×10
oracle ×8
plsql ×3
python ×2
sql ×2
c++ ×1
cursor ×1
cx-oracle ×1
dynamic-sql ×1
indexing ×1
java ×1
mysql ×1
oracle11gr1 ×1