我通过CHATGPT生成了以下代码,以便更好地理解Oracle SQL中的绑定变量:
DECLARE
v_employee_id NUMBER := 1001;
v_employee_name VARCHAR2(50);
v_salary NUMBER;
BEGIN
-- SQL statement with bind variables
SELECT employee_name, salary
INTO v_employee_name, v_salary
FROM employees
WHERE employee_id = v_employee_id;
-- Output the results
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id);
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee not found.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;
/
字符串
我使用过的其他资源声称在名称前需要一个冒号来指定绑定变量。我意识到ChatGPT只有这么准确。我是否需要在这段代码中的变量前加上冒号来将它们指定为绑定变量?
1条答案
按热度按时间pgx2nnw81#
占位符(绑定)变量从正在执行的语句外部的源获取输入,Oracle希望它们以冒号
:
命名和前缀。在Oracle Expression文档中:
placeholder ::=
x1c 0d1x的数据
...
占位符
:host_variable
个在PL/SQL主机环境中声明并作为绑定变量传递给PL/SQL的变量的名称。不要在冒号(:)和
host_variable
之间放置空格。:indicator_variable
个在PL/SQL主机环境中声明并作为绑定变量传递给PL/SQL的指示符变量的名称。(指示符变量指示其关联的主机变量的值或条件。例如,在Oracle预编译器环境中,指示符变量可以检测输出主机变量中的空值或截断值。)不要在host_variable和冒号(:)之间或冒号和
indicator_variable
之间放置空格。这是正确的:字符串
一些Oracle驱动程序(包括JDBC、ODBC)允许匿名(未命名、位置)占位符(bind)变量,该变量由单个问号
?
标识。至于你的问题:
我是否需要在这段代码中的变量前加上冒号来将它们指定为绑定变量?
严格来说是的如果你想使用一个外部定义的占位符(bind)变量而不是本地定义的PL/SQL变量,那么,是的,你需要在bind变量前面加上一个
:
。但是,在代码中,您使用的是本地定义的PL/SQL变量,在这种情况下,您不需要冒号
:
作为PL/SQL变量的前缀,因为该变量是本地定义的,不是外部定义的占位符(bind)变量。要继续使用本地定义的PL/SQL变量,则不需要更改代码。看看两者之间的区别:
型
输出
1
,不需要:
,因为PL/SQL变量是定义的,并在EXECUTE IMMEDIATE
执行的语句的作用域内赋值。然而:
型
输出
2
和:
,因为值从调用EXECUTE IMMEDIATE
的作用域传递到内部作用域,其中占位符之前需要冒号:
。fiddle