假设我下面有对象,我想用使用my_index的查询创建过程。我试图在我的plsql开发人员中使用解释计划窗口(我不得不将查询从块中剥离出来),似乎变量A中的select将my_constant转换为variable,而my_index没有使用。如果我为变量B中的查询生成解释计划,则使用my_index。我真的必须使用变量B才能让my_index工作吗?
CREATE OR REPLACE PACKAGE my_package IS
my_constant CONSTANT NUMBER(1) := 1;
END;
CREATE TABLE my_table (my_id NUMBER,my_column NUMBER(1));
CREATE INDEX my_index ON my_table (CASE WHEN my_column = 1 THEN my_id END);
-- variant A (using my_constant directly)
DECLARE
v_my_id my_table.my_id%TYPE;
BEGIN
SELECT my_id
INTO v_my_id
FROM my_table
WHERE CASE
WHEN my_column = my_package.my_constant THEN
my_id
END = 123;
END;
-- variant B (using value of constant with commented refference for future me)
DECLARE
v_my_id my_table.my_id%TYPE;
BEGIN
SELECT my_id
INTO v_my_id
FROM my_table
WHERE CASE
WHEN my_column = 1 /*my_package.my_constant*/ THEN
my_id
END = 123;
END;
我试着搜索论坛,问我的DBA,聊天GPT,我仍然无法找到满意的答案。
1条答案
按热度按时间m1m5dgzv1#
不能在SQL作用域中直接使用PL/SQL包变量;但是,您可以在SQL作用域中使用PL/SQL函数,并为常量编写 Package 器:
然后又道:
您可以在PL/SQL作用域中使用PL/SQL包变量,并将它们作为绑定变量传递给SQL查询:
然而,在这两种情况下,SQL引擎不知道该值在PL/SQL范围内是一个常量,必须将其视为变量,然后它不知道该值将始终为1,因此将不使用索引。
你可以做的是创建索引:
然后用途:
它可以使用索引。
请参阅fiddle的例子和解释计划。