【问题标题】:Table Valued function in Sql developerSql 开发人员中的表值函数
【发布时间】:2019-04-02 23:10:27
【问题描述】:

我在 Sql server 2012 中创建了一个表值函数,它工作正常 但是当我在同一张表上应用相同的代码但使用 Oracle Sql 开发人员时 它显示语法错误

SQL Server 中的函数

Create Function fx_Mfr

(
@Mfr varchar
)

returns table

as

Return

Select * from Manufacturer

where Mfr = @Mfr

【问题讨论】:

  • CREATE FUNCTION in Oracle 创建一个 PL/SQL 存储函数。 SQL Server 中的存储函数使用 Transact-SQL。这些不是一回事,它们都不是标准的 SQL。因此语法是相同的。您需要学习 PL/SQL 语法才能创建 PL/SQL 函数。
  • 您已使用 SQL Developer 连接到 sql server,并且您正在尝试运行此代码并且遇到语法错误?或者您正在尝试使用 SQL Developer 在 Oracle 数据库中的“相同”表上实现相同的结果?

标签: oracle plsql oracle-sqldeveloper


【解决方案1】:

一种选择是返回 ref 游标,例如在这个例子中(有点模拟你在 MS SQL Server 中的内容):

SQL> create or replace function fx (par_deptno in number)
  2    return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    open rc for
  7      select deptno, ename, job, sal
  8      from emp
  9      where deptno = par_deptno;
 10    return rc;
 11  end;
 12  /

Function created.

SQL> select fx(10) from dual;

FX(10)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO ENAME      JOB              SAL
---------- ---------- --------- ----------
        10 CLARK      MANAGER         2450
        10 KING       PRESIDENT      10000
        10 MILLER     CLERK           1300


SQL>

【讨论】:

  • 谢谢@Littlefoot
【解决方案2】:

或者使用隐式语句结果 - 如果您使用的是 Oracle 12c 或更高版本的数据库。添加此功能是为了更轻松地从 SQL Server 迁移代码。

CREATE OR REPLACE PROCEDURE fx (par_deptno IN NUMBER)
AS
  l_cursor_1 SYS_REFCURSOR;
BEGIN
      OPEN l_cursor_1 FOR
      SELECT department_id, first_name, last_name, job_id, salary 
      FROM   employees
      WHERE  department_id = par_deptno;

    DBMS_SQL.RETURN_RESULT(l_cursor_1);
END;
/

然后执行程序

DECLARE
  PAR_DEPTNO NUMBER;
BEGIN
  PAR_DEPTNO := 100;

  FX(
    PAR_DEPTNO => PAR_DEPTNO
  );
END;

输出会自动从数据库返回:

Examples/docs on Oracle-Base

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多