문제

나는 여기에 뭔가를 놓친 것 같아요.트리거의 관련 부분은 다음과 같습니다.

CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
/* Removed for brevity */
OPEN columnNames('TEMP');

그리고 제가 받은 오류 메시지는 다음과 같습니다.

27/20   PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES'
27/2    PL/SQL: Statement ignored

문서를 올바르게 이해하고 있다면 제대로 작동할 것입니다. 그러나 그렇지 않기 때문에 뭔가 잘못하고 있는 것입니다.어떤 아이디어가 있나요?


@매튜 - 도움을 주셔서 감사하지만 제가 혼란스러운 이유는 이 코드가 제게는 작동하지 않고 참조된 오류를 일으키기 때문입니다.데이터베이스에 코드가 거의 똑같은 다른 트리거가 있으므로 내가 잘못한 것인지 또는 트리거를 저장하려는 방법에 문제가 있는지 확실하지 않습니다.


@매튜 - 글쎄요, 이제 부끄러워지네요.귀하가 제공한 코드를 새 트리거에 복사/붙여넣기했는데 제대로 작동했습니다.그래서 원래 트리거로 돌아가서 시도해 보았더니 오류 메시지가 다시 나타났습니다. 단, 이번에는 트리거에서 항목을 삭제하기 시작했고 이 줄을 제거한 후에는

FOR columnName IN columnNames LOOP

모든 것이 잘 저장되었습니다.그래서 내가 오류가 있다고 생각했던 곳이 실제로 오류가 있었던 곳이 아니었음이 밝혀졌습니다.

도움이 되었습니까?

해결책

@롭

여기에 있는 코드를 잘라내어 붙여넣으면 작동합니까?

코드를 어떻게/어디에서 호출하고 있나요?방아쇠에 있는 거 맞지?

여기에 작성한 쿼리는 실제로 오류를 생성하는 코드이거나 단지 예입니다(예: 위에 있는 쿼리로 오류를 재현할 수 있습니까).

다른 팁

문제의 원인을 명확히하기 위해.당신이 말한대로

OPEN 컬럼이름('TEMP');

동안 일했다

FOR 컬럼이름 IN 컬럼이름 LOOP

하지 않았다.FOR 문은 다음과 같은 매개변수도 포함하면 제대로 작동합니다.

FOR 열이름 IN 열이름('TEMP') LOOP

행을 가져오는 코드를 표시하지 않아서 목적을 알 수는 없지만 제가 작업하는 곳에서는 OPEN이 일반적으로 첫 번째 행(이 경우 주어진 테이블의 첫 번째 열 이름)을 가져오는 데 사용됩니다. FOR는 반환된 모든 행을 반복하는 데 사용됩니다.

@Rob의 의견.댓글을 달 수 없으므로 대신 여기에 업데이트하세요.누락된 매개변수는 위에서 설명한 내용입니다.단순히 FOR 루프를 삭제했다는 응답을 추가했습니다.당시에는 삭제하면 왜 차이가 나는지 이해하지 못한 것 같습니다.이것이 귀하의 필요에 따라 FOR 루프가 더 나은 솔루션일 수 있기 때문에 설명하려고 시도한 이유입니다.

나에게는 잘 작동합니다.

create or replace procedure so_test_procedure as 
 CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN      
 OPEN columnNames('TEMP');
 CLOSE columnNames;
END;

procedure so_test_procedure Compiled.
execute so_test_procedure();

anonymous block completed
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top