이 함수에서 "길이가 잘못된 매개 변수가 LEFT 또는 SUBSTRING 함수에 전달되었습니다"라는 오류가 발생하면 "Abracadabra {34}"또는 문자열에 "{}"이 없다면 가져 가지 않습니다. "CASE"가 있는데 제대로 작동하지 않는 것 같습니다. 확실히 그것은 전형적인 경우 - Abracadabra {34} "와 완벽하게 작동하지만 쿼리의 복잡한 조건 때문에이 함수를 다른 경우와 비교할 수 없습니다. 어쩌면 당신은 실수를 할 수 있습니다. 도와주세요.잘못된 연결 매개 변수가 행 연결의 LEFT 또는 SUBSTRING 함수에 전달되었습니다.
CREATE FUNCTION func (
@nidop int
)
RETURNS varchar
BEGIN
DECLARE @sreturn varchar(1000);
SET @sreturn = '';
SELECT
@sreturn = CASE CHARINDEX('{', wp.description)
WHEN 0 THEN @sreturn
ELSE
@sreturn + SUBSTRING(wp.description, CHARINDEX('{', wp.description) + 1,
CHARINDEX('}', wp.description) - CHARINDEX('{', wp.description) - 1) + ','
END
FROM
(/*some select*/) ttt, RB_WORKPLACE wp
WHERE wp.classified = ttt.ap
ORDER BY CASE WHEN CHARINDEX('{', wp.[description]) > 0 THEN
CONVERT(INT,
SUBSTRING(wp.[description],
CHARINDEX('{', wp.[description]) + 1,
CHARINDEX('}', wp.[description]) - CHARINDEX('{', wp.[description]) - 1)
)
ELSE 0
END;
SET @sreturn = SUBSTRING(@sreturn, 1, LEN(@sreturn) - 1)
RETURN @sreturn;
END;
문제에 대해 더 자세히 알려 드리려고합니다. 이 함수에서 내가 오라클에서 다른 기능을 마이그레이션하기 위해 노력하고있어 :
create or replace function func(nidop in number) return varchar2 as
sreturn varchar2(1000);
begin
select listagg(to_number(substr(wp.description, instr(wp.description, '{') + 1,
instr(wp.description, '}') - instr(wp.description, '{') - 1)), ',') within group(order by to_number(substr(wp.description, instr(wp.description, '{') + 1, instr(wp.description, '}') - instr(wp.description, '{') - 1)))
into sreturn
from (/*some select*/) ttt, workplace wp
where wp.classified = ttt.ap;
return sreturn;
exception
when others then
return null;
end func;
가 Temporaly 내가이 광산하지 쿼리를 변경하는 "XML 경로 ('')"쿼리처럼, 덕분에 모두 도움. 예를 들어 varchar (50) 대신 varchar를 반환했기 때문에 하나의 항목 만있었습니다 (내 경우)
SELECT @local_variable = @ local_variable의 일부 함수는 연결을 수행하기위한 신뢰할 수있는 방법이 아니라는 점에 유의해야합니다. 문서에서는 특히 표현식이 각 행에 대해 한 번만 평가된다는 보장이 없음을 경고합니다. –
그리고 스칼라 함수는 대단히 비효율적입니다. 스칼라가 아닌 인라인 테이블 값 함수로 변경하는 것을 고려해야합니다. –
또 다른 제안은 여기서 사용하는 조인의 구식 버전 대신 ANSI-92 스타일 조인을 사용하는 것입니다. 매개 변수를 가지고 있지만 게시 한 코드의 어느 곳에서나 참조되지 않기 때문에 명확하게이 코드의 중요한 부분을 빠뜨린 것입니다. –