ADO를 통해 원격 Oracle 11gr2 서버로 다음 PL/SQL을 보내고 있습니다. 사용자의 존재 여부를 확인하는 것이 목적입니다. 그런 다음 모든 연결을 종료하십시오. 마지막으로 사용자를 삭제합니다. Oracle PL/SQL 문에서 오류가 발생했습니다.
DECLARE
i INTEGER;
BEGIN
select count(1) into i from dba_users where username='<schema>';
if i=0 THEN
FOR c IN (SELECT s.sid,s.serial# FROM v$session s WHERE s.username = '<schema>') LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' ||c.sid || ',' || c.serial# || '''';
END LOOP;
drop user <schema> Cascade;
END IF;
END;
내가 훨씬 미세 조정 후받은 오류 메시지
은 여전히 :ERROR:[Microsoft][ODBC driver for Oracle][Oracle]ORA-06550: line 1, column 286: PLS-00103: Encountered the symbol "DROP" when expecting one of the following:
(begin case declare else elsif end exit for goto if loop mod
null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
그것은 IF 문 안에 드롭 데의 구문을 좋아하지 않는다. 누가 이걸 제대로 달릴 지 누가 알겠습니까?
편집 : 분명히 말하자면, 나는 보통이 방식으로이 문장을 실행하지 않을 것입니다. 그러나 환경으로 인해 유일한 방법이며 보안 위험을 초래하지 않습니다. 나는 거의 모든 좋은 습관을 어 기고 있음을 알고 있지만, 이번에는 필요하다!
내가 ** 매우 ** 저장 프로 시저 내에서이 작업을 수행하는 것이 좋습니다 ... 희망이 도움이. 이렇게하면 몇 가지 작업을 수행 할 수 있습니다. 1) 문제에서 제트 파서를 제거하고 Oracle에서 내부 처리하도록합니다. 2) SP를 구조화하여 성공/실패로 1 또는 0을 반환함으로써 분사 시도를 거부 할 수 있습니다. 또한 * Ollie * 조언에 유의하고 바인드 매개 변수를 사용하여 SQL 트랜잭션의 보안을 강화합니다. – FlyingGuy
@wave : 또한 count (*)보다'count (1)'을 사용하는 것은 장점이 없습니다. 또한, SQL 구문 분석 엔진은 어쨌든'count (1)'을'count (*) '로 변경합니다. Tom Kyte의 다음 기사를 참조하십시오. [Select Count (1) : 작동 방식] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789)) – Wolf