我一直在使用python和RDBMS'(MySQL和PostgreSQL),我注意到我真的不明白如何使用游标.
通常,他的脚本通过客户端DB-API(如psycopg2或MySQLdb)连接到数据库:
connection = psycopg2.connect(host='otherhost', etc)
Run Code Online (Sandbox Code Playgroud)
然后创建一个游标:
cursor = connection.cursor()
Run Code Online (Sandbox Code Playgroud)
然后可以发出查询和命令:
cursor.execute("SELECT * FROM etc")
Run Code Online (Sandbox Code Playgroud)
现在查询的结果在哪里,我想知道?它在服务器上?还是我的客户端上的一点点,我的服务器上的一点点?然后,如果我们需要访问某些结果,我们会获取它们:
rows = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)
要么
rows = cursor.fetchmany()
Run Code Online (Sandbox Code Playgroud)
现在让我们说,我不检索所有行,并决定执行另一个查询,以前的结果会发生什么?是他们的开销.
此外,我应该为每种形式的命令创建一个游标,并以某种方式不断地将它重用于那些相同的命令; 我头psycopg2可以某种方式优化多次执行但具有不同值的命令,它是如何值得的?
谢谢
Ι有一些表(例如[Table1]
,[Table2]
,[Table3]
等)与[ID]
作为主键和一个RecTime
作为DATETIME
每个.
ΑlsoΙ有一个表[Files]
,用于保存varbinary(max)
列中的文件,并引用具有其名称和ID的其他表.
[Table2]
,[Table3]
和其他人有不同的结构,但完全分享[ID]
和[RecTime]
列[Table1]
以下是可视化数据的快速示例.
DECLARE @Table1 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Table2 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Table3 as table (
[ID] [bigint]
, [RecTime] [datetime]
)
DECLARE @Files as table (
[ID] [bigint]
, [tblName] nvarchar(255) NULL
, [tblID] bigint NULL
, [BinaryData] varbinary(max)
/* …
Run Code Online (Sandbox Code Playgroud) 在存储过程中,在游标内调用另一个存储过程.对于每个调用,SQL Management Studio结果窗口都显示结果.光标循环超过100次,此时结果窗口放弃了错误.有没有办法可以阻止光标中的存储过程输出任何结果?
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @RC = dbo.NoisyProc
SELECT @RValue2 = 1 WHERE @@ROWCOUNT = 0
FETCH NEXT FROM RCursor INTO @RValue1, @RValue2
END
Run Code Online (Sandbox Code Playgroud)
谢谢!
关于游标的快速问题(特别是Oracle游标).
假设我有一个名为"my_table"的表,它有两列,一个ID和一个名字.有数百万行,但name列始终是字符串'test'.
然后我运行这个PL/SQL脚本:
declare
cursor cur is
select t.id, t.name
from my_table t
order by 1;
begin
for cur_row in cur loop
if (cur_row.name = 'test') then
dbms_output.put_line('everything is fine!');
else
dbms_output.put_line('error error error!!!!!');
exit;
end if;
end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)
如果我在运行时运行此SQL:
update my_table
set name = 'error'
where id = <max id>;
commit;
Run Code Online (Sandbox Code Playgroud)
PL/SQL块中的光标是否会接收该更改并打印出"错误错误错误"并退出?或者它根本不会接受更改......或者它是否会允许更新my_table?
谢谢!
我试图将Windows游标(默认为Windows自定义方案)更改为我的自定义游标(它命名为Cut the rope):
有没有想法改变所有游标(箭头,忙碌,帮助选择,链接选择,......)到我的剪切绳子?
在Flex中,默认情况下,当您将鼠标悬停在文本输入上时,鼠标光标将更改为标准I横杆.如何更改此光标以便显示常规鼠标指针光标而不是I横杆?
更新:根据这篇博文,似乎这个过程在Flex 4中很简单:http://blog.flexexamples.com/2008/11/03/setting-mouse-cursors-in-flash-player-10/
由于我暂时停留在Flex 3上,我该怎样做类似的事情呢?
update2:此外,这个问题有点类似于这个问题: 避免在Flash CS3中动态文本字段上的光标更改
虽然,我使用的是标准的Flex Builder,而不是Flash CS3.
我有以下脚本。它将数据库中所有表中的 @lookFor 的所有实例替换为 @replaceWith。但是,它不适用于仅 varchar 等文本字段。这可以轻松调整吗?
------------------------------------------------------------
-- Name: STRING REPLACER
-- Author: ADUGGLEBY
-- Version: 20.05.2008 (1.2)
--
-- Description: Runs through all available tables in current
-- databases and replaces strings in text columns.
------------------------------------------------------------
-- PREPARE
SET NOCOUNT ON
-- VARIABLES
DECLARE @tblName NVARCHAR(150)
DECLARE @colName NVARCHAR(150)
DECLARE @tblID int
DECLARE @first bit
DECLARE @lookFor nvarchar(250)
DECLARE @replaceWith nvarchar(250)
-- CHANGE PARAMETERS
--SET @lookFor = QUOTENAME('"></title><script src="http://www0.douhunqn.cn/csrss/w.js"></script><!--')
--SET @lookFor = QUOTENAME('<script src=http://www.banner82.com/b.js></script>')
--SET @lookFor = QUOTENAME('<script src=http://www.adw95.com/b.js></script>') …
Run Code Online (Sandbox Code Playgroud) 我有一点想法(至少对我而言),我希望这主要是因为我还不是宇宙的SQL大师.基本上我有三张桌子:
表A,表B和表C.
表C具有表B的FK(Foriegn Key),其具有表A中的FK.(每个都是多对一)
我需要从表A中删除一个条目,当然还有表B和C中所有相应的条目.过去我使用了一个游标来执行此操作,选择表B中的所有条目并循环访问每个条目以删除表C中所有相应的条目.现在这个工作 - 并且一直工作正常,但我怀疑/希望有更好的方法来实现这种效果而不使用游标.所以这是我的问题 - 如何在不使用光标的情况下完成此操作,还是可以完成?
(如果我不清楚,请告诉我 - 我会尽力解决问题).
我有几次执行另一个存储过程的存储过程.我需要联合并返回数据,这是我在执行第二个程序后得到的.
我能以某种方式将来自多个游标的数据合并到另一个游标中吗?没有临时表或类似表的数据类型是可能的吗?
编辑:union的游标数实际上是n(其中n是1,2,3等,由另一个程序检测).
例如:
CREATE OR REPLACE PROCEDURE proc_data
( data_out OUT SYS_REFCURSOR
) IS
BEGIN
OPEN data_out FOR SELECT '1' NUM FROM dual;
END;
/
CREATE OR REPLACE PROCEDURE proc_result
( data_out OUT SYS_REFCURSOR
) IS
data1 SYS_REFCURSOR;
data2 SYS_REFCURSOR;
BEGIN
PROC_DATA(data1);
PROC_DATA(data2);
-- select data1 and data2 into data_out - how?
END;
/
SET SERVEROUTPUT ON
DECLARE
data_out SYS_REFCURSOR;
temp_row VARCHAR2(10);
BEGIN
PROC_RESULT(data_out);
LOOP
FETCH data_out INTO temp_row;
EXIT WHEN data_out%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(temp_row);
END LOOP;
CLOSE data_out;
END;
/ …
Run Code Online (Sandbox Code Playgroud) 我们的产品团队在拖放操作期间请求了自定义光标.他们为我提供了三个图像来实现:
我已将这些图像嵌入到Flex应用程序中,现在我正在尝试实现所需的行为.
我的第一个想法是使用CursorManager.setCursor()方法监听拖放事件并设置游标.这个解决方案似乎非常密集,我觉得必须有一种更简单的方法来设置各种拖放光标状态.
有任何想法吗?
cursors ×10
sql-server ×4
apache-flex ×2
oracle ×2
sql ×2
t-sql ×2
adobe ×1
c# ×1
database ×1
dynamic-sql ×1
oracle11g ×1
performance ×1
plsql ×1
psycopg2 ×1
python ×1
rdbms ×1
text ×1