oracle 是否可以创建没有冒号的绑定变量?

ttp71kqs  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(104)

我通过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只有这么准确。我是否需要在这段代码中的变量前加上冒号来将它们指定为绑定变量?

pgx2nnw8

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之间放置空格。这是正确的:

:host_variable:indicator_variable

字符串
一些Oracle驱动程序(包括JDBC、ODBC)允许匿名(未命名、位置)占位符(bind)变量,该变量由单个问号?标识。
至于你的问题:
我是否需要在这段代码中的变量前加上冒号来将它们指定为绑定变量?
严格来说是的如果你想使用一个外部定义的占位符(bind)变量而不是本地定义的PL/SQL变量,那么,是的,你需要在bind变量前面加上一个:
但是,在代码中,您使用的是本地定义的PL/SQL变量,在这种情况下,您不需要冒号:作为PL/SQL变量的前缀,因为该变量是本地定义的,不是外部定义的占位符(bind)变量。要继续使用本地定义的PL/SQL变量,则不需要更改代码。
看看两者之间的区别:

BEGIN
  DBMS_OUTPUT.ENABLE();

  EXECUTE IMMEDIATE
    'DECLARE plsql_variable NUMBER := 1; BEGIN DBMS_OUTPUT.PUT_LINE(plsql_variable); END;';
END;
/


输出1,不需要:,因为PL/SQL变量是定义的,并在EXECUTE IMMEDIATE执行的语句的作用域内赋值。
然而:

BEGIN
  DBMS_OUTPUT.ENABLE();

  EXECUTE IMMEDIATE
    'BEGIN DBMS_OUTPUT.PUT_LINE(:named_bind_variable); END;'
    USING 2;
END;
/


输出2:,因为值从调用EXECUTE IMMEDIATE的作用域传递到内部作用域,其中占位符之前需要冒号:
fiddle

相关问题