gpt4 book ai didi

Oracle SQL 和 PL/SQL 上下文切换

转载 作者:行者123 更新时间:2023-12-04 03:00:02 24 4
gpt4 key购买 nike

我在oracle pl sql中有一个代码,真的很想了解那里有多少上下文切换

If x=0 then 

curserx= select a from mytable1;

Else

curserx=select a from mytable1 where id=:x;

End;

Loop

Fetch on cursorx

Select c from mytable2 where a=curserx.a;

End loop;

这只是一个示例代码,请原谅任何文本大小写和逻辑错误。

最佳答案

我将您的伪代码转换为 PL/SQL 并包含说明我相信您将在何处进行从 PL/SQL 引擎到 SQL 引擎的上下文切换的注释。

请注意,如果您要查询大量行,则可以使用 FETCH BULK COLLECT INTO 并在每次提取时检索多行,从而大大减少上下文切换。

DECLARE
l_x_value INTEGER;
l_cursor SYS_REFCURSOR;
l_fetched mytble1.a%TYPE;
BEGIN
/* context switch to open */
IF x = 0
THEN
OPEN l_cursor FOR SELECT a FROM mytable1;
ELSE
OPEN l_cursor FOR
SELECT a
FROM mytable1
WHERE id = l_x_value;
END IF;

LOOP
/* context switch per fetch */
FETCH l_cursor INTO l_fetched;

EXIT WHEN l_cursor%NOTFOUND;

/* context switch for implicit cursor */
SELECT c
INTO l_fetched
FROM mytable2
WHERE a = curserx.a;
END LOOP;

/* context switch to close */
CLOSE l_cursor;
END;

但这还不是全部!请记住,上下文切换有两种方式:SQL -> PL/SQL 和 PL/SQL -> SQL。您可以通过使用 UDF pragma (12c+) 声明您的函数或使用 WITH FUNCTION 子句(也是 12c+)定义它来减少从 SQL 到 PL/SQL 的开销。仍然存在上下文切换,但一些工作是在编译时而不是运行时完成的。

所以在下面的代码中,对于每次从 SELECT 中调用函数,都有一个开关。

CREATE OR REPLACE FUNCTION full_name (first_in   IN VARCHAR2,
last_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN first_in || ' ' || last_in;
END;
/

DECLARE
l_name VARCHAR2 (32767);
BEGIN
SELECT full_name (first_name, last_name) INTO l_name
FROM employees
WHERE employee_id = 100;

DBMS_OUTPUT.PUT_LINE (l_name);
END;
/

最后一个警告:您应该尽一切可能避免在函数内执行 SQL,然后从 SQL 调用该函数。适用于您的 SQL 语句的标准读取一致性模型不会“带入”到函数的 SQL 中。换句话说,如果您“外部”SELECT 在 10:00 开始运行并运行一个小时,并且在 10:05,有人从表中删除行,该表同时用于外部查询和函数中的查询(和提交),这两个查询将处理这些表的不同状态。

关于Oracle SQL 和 PL/SQL 上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50050454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com