Переписать функцию Oracle в SQL-сервере - PullRequest
0 голосов
/ 11 июня 2019

У меня есть функция Oracle, которую нужно преобразовать в функцию SQL-Server

Это функция Oracle:

FUNCTION check_education(in_crs_code IN VARCHAR2)
    RETURN BOOLEAN IS
    v_bool            BOOLEAN := FALSE;
    v_dummy            VARCHAR2(1);

    CURSOR find_education  IS
        SELECT 'x'
          FROM KU_LIBRARY_EDUCATION_EXTLOAN
         WHERE UPPER(course_code) = UPPER(in_crs_code) AND in_use = 'Y';
BEGIN
    OPEN find_education;

    FETCH find_education     INTO v_dummy;

    IF find_education%FOUND THEN
        v_bool        := TRUE;
    ELSE
        v_bool        := FALSE;
    END IF;

    CLOSE find_education;

    RETURN (v_bool);
END check_education;

Это то, что я написал в SQL-Server длядублировать функцию Oracle:

   CREATE FUNCTION [dbo].[check_education](@in_crs_code VARCHAR(4000))
    RETURNS BIT AS
BEGIN
    DECLARE @v_bool BIT = 0;
    DECLARE @v_dummy VARCHAR(1);

    DECLARE find_education CURSOR LOCAL  FOR
        SELECT 'x'
          FROM [dbo].[KU_LIBRARY_EDUCATION_EXTLOAN]
         WHERE UPPER(course_code) = UPPER(@in_crs_code) 
         AND in_use = 'Y';

    OPEN find_education;

    FETCH find_education INTO @v_dummy;

    IF @@CURSOR_ROWS >1 BEGIN
        SET @v_bool = 1;
    END
    ELSE BEGIN
        SET @v_bool = 0;
    END 

    CLOSE find_education;
    DEALLOCATE find_education;

    RETURN (@v_bool);
END;

Я ожидаю, что функция сервера SQL вернет 1, если курсор вернет 'x', но я получаю 0. Помощь Anu будет оценена.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Я бы предложил использовать встроенную табличную функцию вместо скалярной функции.Чтобы убедиться, что это встроенная табличная функция, она ДОЛЖНА быть единственным оператором выбора.Это означает, что не может быть петель и прочего.К счастью, этот запрос на самом деле не нуждается ни в каких циклах.Простой счет вернет количество строк.И любое значение, отличное от 0 при преобразовании в бит, всегда будет 1.

CREATE FUNCTION [dbo].[check_education]
(
    @in_crs_code VARCHAR(4000)
) RETURNS table as return

    SELECT CourseExists = convert(bit, count(*))
    FROM [dbo].[KU_LIBRARY_EDUCATION_EXTLOAN]
    WHERE UPPER(course_code) = UPPER(@in_crs_code) 
        AND in_use = 'Y';
0 голосов
/ 11 июня 2019

Это просто EXISTS вещь, поэтому мы могли бы попробовать

CREATE FUNCTION [dbo].[check_education](@in_crs_code VARCHAR(4000)) RETURNS BIT AS
BEGIN
  RETURN EXISTS ( <query> )
END;    

Но, насколько я знаю, SQL Server не принимает это (хотя я не могу сказать, почему нет - возможно, это потому, чтоиз-за отсутствия реального логического значения, Oracle не принимает его, потому что EXISTS не является ключевым словом в их языке программирования PL / SQL).

Поэтому мы будем использовать IF / THEN /ELSE:

CREATE FUNCTION [dbo].[check_education](@in_crs_code VARCHAR(4000)) RETURNS BIT AS
BEGIN
  IF EXISTS
  (
    SELECT 'x' 
    FROM ku_library_education_extloan
    WHERE UPPER(course_code) = UPPER(in_crs_code) AND in_use = 'Y'
  )
    RETURN 1
  ELSE
    RETURN 0
  END
END;

Могут быть ошибки, потому что я никогда не кодировал хранимую процедуру в T-SQL, но в любом случае, вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...