programing

sqlplus를 사용하여 명령줄에서 Oracle 스크립트를 실행하는 중 문제 발생

cafebook 2023. 8. 6. 10:21
반응형

sqlplus를 사용하여 명령줄에서 Oracle 스크립트를 실행하는 중 문제 발생

sqlplus를 사용하여 내 sql 스크립트를 오라클로 실행하는 데 문제가 있습니다.이 스크립트는 일부 더미 데이터만 채웁니다.

DECLARE 
  role1Id NUMBER;
  user1Id NUMBER;
  role2Id NUMBER;
  user2Id NUMBER;
  role3Id NUMBER;
  user3Id NUMBER;
  perm1Id NUMBER;
  perm2Id NUMBER;
  perm3Id NUMBER;
  perm4Id NUMBER;
  perm5Id NUMBER;
BEGIN
  INSERT INTO PB_USER(USER_ID,USER_NAME, USER_EMAIL, USER_ACTIVEYN)
  VALUES(PB_USER_ID_SEQ.nextval, 'RoleDataManagerTests_Username', 'test@test.com',' ');

  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 1');
  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 2');
  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 3');

  SELECT ROLE_ID INTO role1Id FROM ROLES WHERE ROLE_NAME = 'Test role 1';
  SELECT USER_ID INTO user1Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user1Id, role1Id);

  SELECT ROLE_ID INTO role2Id FROM ROLES WHERE ROLE_NAME = 'Test role 2';
  SELECT USER_ID INTO user2Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user2Id, role2Id);

  SELECT ROLE_ID INTO role3Id FROM ROLES WHERE ROLE_NAME = 'Test role 3';
  SELECT USER_ID INTO user3Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user3Id, role3Id);

  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm1', 'permission 1');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm2', 'permission 2');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm3', 'permission 3');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm4', 'permission 4');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm5', 'permission 5');

  SELECT PERMISSION_ID INTO perm1Id FROM PERMISSIONS WHERE KEY = 'perm1';
  SELECT PERMISSION_ID INTO perm2Id FROM PERMISSIONS WHERE KEY = 'perm2';
  SELECT PERMISSION_ID INTO perm3Id FROM PERMISSIONS WHERE KEY = 'perm3';
  SELECT PERMISSION_ID INTO perm4Id FROM PERMISSIONS WHERE KEY = 'perm4';
  SELECT PERMISSION_ID INTO perm5Id FROM PERMISSIONS WHERE KEY = 'perm5';

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm1Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm2Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm3Id);

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role2Id, perm3Id);

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role3Id, perm4Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role3Id, perm5Id);
END;
/

Oracle SQL Developer를 사용하여 스크립트를 실행할 때는 정상적으로 작동하지만 sqlplus 명령줄 도구를 사용하면 다음과 같이 출력되고 중단됩니다.

SQL*Plus: Release 11.1.0.7.0 - Production on Tue May 11 09:49:34 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining Scoring Engine
and Real Application Testing options

이 명령줄을 사용하여 도구를 실행하고 있습니다. 이 명령줄은 다른 스크립트에서도 사용할 수 있습니다.

sqlplus username/password@server/dbname @Setup.sql

아이디어 있어요?감사해요.

둘 중 하나를 입력해야 합니다.exit스크립트의 마지막에 또는 다음과 같이 실행합니다.sqlplus username/password@server/dbname < Setup.sql(즉, 리디렉션된 입력,<대신에@). 교수형 세션에서 '종료'만 입력하면 문제가 없는지 확인할 수 있습니다.

정말 중단된 경우, 개발자로부터 실행을 커밋하거나 롤백했습니까?

Toad와 같은 클라이언트에서 정상적으로 실행되는 특정 스크립트에서도 이 문제가 발생했지만 SQLPlus를 통해 @script 디렉티브를 사용하여 실행될 때 SQLPlus 클라이언트는 실행 중인 스크립트의 줄 수(+1)에 해당하는 번호가 포함된 프롬프트를 반환합니다.

예를 들어 'do it'이라는 스크립트를 실행한 경우입니다.sql'은 70줄로 구성되어 있으며 적절한 명령을 사용하여 SQL Plus를 시작하고 다음과 같이 입력합니다.

> @doit.sql

그러면 다음을 확인할 수 있습니다.

71:

이 지점에서 Enter 키를 누르면 되돌아갑니다.

72:

다음을 입력하여 이 스크립트를 실행할 수 있었습니다./프롬프트에서 Enter 키를 누릅니다.

간단한 대답

'end;'와 '/'를 모두 마지막 줄에 놓아야 합니다.

그것은 쉽게 실행될 것입니다.

명령줄

sqlplus username/password@server/dbname @Setup.sql

위에서 언급한 것은 다음을 의미합니다.sqlplus스크립트를 실행해야 합니다.Setup.sql대화형으로 추가 명령을 기다립니다(스크립트가 실행하지 않는 경우).exit노골적으로)이것은 의 일반적인 동작입니다.sqlplus.

sqlplus다음 세 가지 경우에 종료됩니다.

  • 오류(일부 오류의 경우 종료 여부를 변경할 수 있습니다. 참조WHENEVERplsql-command)
  • 명시적exit(대화형 및 스크립트 모두)
  • STDIN 종료(EOF)

대화형 모드 또는 스크립트에서 보낼 수 있습니다.^Z입력 흐름을 부드럽게 종료하는 문자입니다.대화식으로 누르면 됩니다.Ctrl+Z,Enter.

물론 STDIN을 리디렉션하여 키보드가 아닌 파일에서 가져올 수도 있습니다.이 작업에는 두 가지 유사한 방법이 있습니다.

1) sqlplus username/password@server/dbname<Setup.sql
2) echo @Setup.sql|sqlplus username/password@server/dbname

두 경우 모두sqlplus 실행 됩니다. 이 는 " " " 때문입니다.EOF입력 흐름에서.

를사는대신을 사용하는 에./프롬프트에서 쿼리가 수행되는지 확인합니다.sql은 세미콜론으로 끝납니다.

문제는 Oracle 클라이언트 홈에서 SQLplus가 실행 중이었고 startup upgrade 명령을 실행하는 동안 충돌했기 때문입니다.

비클라이언트 오라클 홈에서 sqlplus를 실행하고 명령을 시도하면 예상대로 작동합니다.해결책은 오라클 클라이언트 홈 대신 메인 오라클 홈에서 sqlplus를 실행하는 것입니다.

언급URL : https://stackoverflow.com/questions/2809267/problem-running-oracle-script-from-command-line-using-sqlplus

반응형