暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

LightDB23.2新特性Oracle模式支持Oracle plsql execute immediate语法

原创 姚崇 2023-06-25
304

LightDB23.2新特性Oracle模式支持plsql execute immediate语法

EXECUTE IMMEDIATE 是 Oracle PL/SQL 中用于动态执行 SQL 语句或 PL/SQL 块的语法。它主要用于在运行时构造和执行 SQL 查询,这在静态 SQL 无法满足需求时非常有用。EXECUTE IMMEDIATE 与 PostgreSQL 的 EXECUTE 语句有一定相似性,但它们在具体使用和语法上有所不同。

SQL> CREATE TABLE employees (
  2      id number PRIMARY KEY,
  3      name VARCHAR(50)
  4  );
Table created.
INSERT INTO employees VALUES (1,'John');

INSERT INTO employees VALUES (2,'Jane');

SQL> INSERT INTO employees VALUES (3,'Alice');

SQL> commit;
Commit complete.

Oracle中返回的结果

DECLARE
  2     sql_query VARCHAR2(100);
  3     emp_name  VARCHAR2(50);
  4     emp_id    NUMBER := 101;
  5  BEGIN
  6     sql_query := 'SELECT name FROM employees WHERE id = :id';
  7     EXECUTE IMMEDIATE sql_query INTO emp_name USING emp_id;
  8     
  9     DBMS_OUTPUT.PUT_LINE('Employee name is: ' || emp_name);
 10  END;
 11  /
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 7

-- 执行
SQL> set serveroutput on 
DECLARE
   sql_query VARCHAR2(100);
SQL>   2    3     emp_name  VARCHAR2(50);
  4     emp_id    NUMBER := 1;
  5  BEGIN
  6     sql_query := 'SELECT name FROM employees WHERE id = :id';
  7     EXECUTE IMMEDIATE sql_query INTO emp_name USING emp_id;
  8     
  9     DBMS_OUTPUT.PUT_LINE('Employee name is: ' || emp_name);
 10  END;
 11  /
Employee name is: John

PL/SQL procedure successfully completed.

LightDB Oracle模式中测试结果

创建测试表

test@test=# CREATE TABLE employees (
test@test(#     id number PRIMARY KEY,
test@test(#     name VARCHAR(50)
test@test(# );
CREATE TABLE
test@test=# INSERT INTO employees VALUES (1,'John');
INSERT 0 1
test@test=# INSERT INTO employees VALUES (2,'Jane');
INSERT 0 1
test@test=# INSERT INTO employees VALUES (3,'Alice');
INSERT 0 1
test@test=# select * from employees;
 id | name  
----+-------
  1 | John
  2 | Jane
  3 | Alice
(3 rows)
## 1、使用plpgsql语法
test@test=# DECLARE
test@test$#    sql_query VARCHAR2(100);
test@test$#    emp_name  VARCHAR2(50);
test@test$#    emp_id    NUMBER := 101;
test@test$# BEGIN
test@test$#    sql_query := 'SELECT name FROM employees WHERE id = :id';
test@test$#    EXECUTE IMMEDIATE sql_query INTO emp_name USING emp_id;
test@test$#    
test@test$#    DBMS_OUTPUT.PUT_LINE('Employee name is: ' || emp_name);
test@test$# END;
test@test$# /
ERROR:  query returned no rows
CONTEXT:  PL/oraSQL function inline_code_block line 7 at EXECUTE
test@test=# 


test@test=# CREATE OR REPLACE FUNCTION get_employee_name(p_employee_id INTEGER)
test@test-# RETURNS VARCHAR AS $$
test@test$# DECLARE
test@test$#     sql_query TEXT;
test@test$#     emp_name  VARCHAR;
test@test$# BEGIN
test@test$#     sql_query := 'SELECT name FROM employees WHERE id = $1';
test@test$#     EXECUTE sql_query INTO emp_name USING p_employee_id;
test@test$# 
test@test$#     RAISE NOTICE 'Employee name is: %', emp_name;
test@test$#     RETURN emp_name;
test@test$# END;
test@test$# $$ LANGUAGE plpgsql;
CREATE FUNCTION

test@test=# select get_employee_name(1) from dual;
NOTICE:  Employee name is: John
 get_employee_name 
-------------------
 John
(1 row)

2、使用plorasql语法

image.png

test@test=# SELECT dbms_output.serveroutput('true');
 serveroutput 
--------------
 
(1 row)

test@test=# DECLARE                                 
   sql_query VARCHAR2(100);
   emp_name  VARCHAR2(50);
   emp_id    NUMBER := 1;
BEGIN
   sql_query := 'SELECT name FROM employees WHERE id = :id';
   EXECUTE IMMEDIATE sql_query INTO emp_name USING emp_id;
   
   DBMS_OUTPUT.PUT_LINE('Employee name is: ' || emp_name);
END;
/
Employee name is: John
DO
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论