2009-07-14 5 views
0

에 코드 블록을 둘러싸 :로컬 방법 내에서 로컬 범위 변수에 다음 당신이 할 수있는 자바에서는 SQL

public void blah() { 
    { 
     int a = 1; 
     int b = 2; 
    } 
    { 
     int a = 3; 
     int b = 4; 
    } 
} 

나는 심지어이 기술의 이름이 무엇인지 모르는, 내가했습니다 단지 하나 또는 두 번 사용하는 데 필요합니다. 현재 상황에서는이 SQL 프로젝트로 정말 유용 할 수 있습니다.

SQL로도 가능합니까?


나는 상황에 더 많은 컨텍스트를 제공하기 위해 MS SQL 서버 ... 을 사용하고 있습니다 :

우리는 데이터베이스에 다양한 작업을 수행 할 수 있도록 파일로 저장 여러 SQL 스크립트가 있습니다. 이 스크립트는 상당히 크며 독립적으로 실행되도록 설계되었습니다. 때로는 여러 스크립트를 함께 실행하고 단일 파일로 제공해야합니다.

이러한 스크립트의 대부분은 공통 변수가 있으므로이 스크립트를 함께 결합 할 때 충돌이 발생합니다. 물론 모든 변수 선언을 파일의 시작 부분으로 옮기기는 쉽지만 목표는이 프로세스를 자동화하는 것입니다.

+0

어떤 RDBMS를 사용하고 있습니까? 신탁? MySQL은? Postgresql? –

+0

향상시키려는 SQL이 있거나 심지어 SQL과 유사한 의사 코드가있는 경우 더 좋은 예가 될 수 있습니다. –

+0

고마워, 나는 조금 더 많은 정보를 추가했다. – Kevin

답변

0

SQL은 선언적 언어입니다 (즉, 'hows'가 아니라 'whats'에 초점을 맞추고 있음). 그러므로 그것의 정의 (ansi)는 절차와 블록을 포함하지 않는다.

대부분의 벤더 구현은 Microsoft의 경우 TSQL, Oracle의 경우 PL/SQL (Mysql 및 SQLlite 등의 경우는 확실하지 않음) - 및 심지어 정확한 기능을 수행하지 않아도이 void를 채 웁니다. Java (익명 코드 블록 없음)와 일치합니다.

각 SQL 조작은 세트에서 작동하고 세트를 리턴합니다.

따라서 "mytable"은 집합이며 "select from mytable"은 집합이며 "select from mytable"은 집합입니다.

그래서 불가능의 종류가 세분화 낮은 수준으로 드릴 다운, 아마도 "열"또는 의사 열은 '변수'

오라클은이 '루프를 보장하기 위해 작업 "이중에서 선택"정의하다 'of 1 (정확히 1 행을 반환하는 SELECT 문)

0

MySQL 변수 선언은 C 함수의 변수가 있어야하는 것처럼 서브 루틴/저장 프로 시저의 시작 부분에 와야합니다. (A class helo에 싸여) 당신이주는 자바 코드 예제를 컴파일하려고

+0

C는 함수 내부의 {} 블록이 자체 변수 선언을 가질 수 있도록 허용합니다. 블록의 변수는 블록의 유효 기간을 가지며 바깥 쪽 블록의 변수는 음영을 나타낼 수 있습니다 (Java에서는 후자가 금지되므로 OP 코드는 ' Java로 실제로 컴파일). –

0

## ## 제목이 생성

$ javac helo.java 
helo.java:7: a is already defined in blah() 
     int a = 3; 
      ^
helo.java:8: b is already defined in blah() 
     int b = 4; 
      ^
2 errors 

을 그래서, 아니, 당신이 이 할 수있는 자바 (C, 예에서, C++, 예, Java, 아니요).

관계형 DB에 포함 된 일부 저장 프로 시저 방언이 반드시 가능할 수도 있지만 SQL 자체에는 렉시 컬 범위가 없습니다 (그러나 정확한 dialect를 알지 못하게하는 것은 어렵습니다). 적절한 SQL에서는 tablename. 접두어가있는 다른 동등한 필드를 정규화합니다.

+0

그가 방금 나쁜 예를 든 것 같아요 –

+0

예, 나쁜 예입니다. 몇 일 전에 이것을 사용했지만 효과가 있었지만 블록 내에서 고유 한 변수 이름을 사용했을 수도 있습니다. 흠 ... – Kevin

+0

포인트는, 당신은 자바의 블록 내에서 (다른 언어에서도 가능하지만) SQL 자체에서도 동사 변수를 사용할 수 없습니다 (일부 프로 시저 언어는 다를 수 있지만 OP는 어느 언어를 지정해야합니까? [관심]). 자바는 의도적으로 C와 C++에서 공통적 이었지만 설계자들이 나쁜 습관이라고 생각했기 때문에이를 의도적으로 금지했다 (필자는 자바의 디자이너 인 FWIW에 동의한다). –

0

SQL Server에서는 블록 범위를 지정할 수 없습니다. DECLARE가 SET 이전이라면 OK입니다. 같은 너무베이스에 적용, 배치 또는 코드 중 하나

BEGIN 
    DECLARE @a int 
END 
BEGIN 
    SET @a = 1 
END 

IIRC의 시작에있을 필요가 없습니다 선언합니다.

관련 문제