source

작동 중인 중단된 쿼리의 수수께끼

nicesource 2023. 8. 27. 09:40
반응형

작동 중인 중단된 쿼리의 수수께끼

저는 제 조직의 다른 개발자가 수년 전에 작성한 오래된 코드를 검토하고 있었습니다.이 코드를 개선하려고 시도하는 동안, 저는 그것이 사용하는 쿼리에 매우 나쁜 문제가 있다는 것을 발견했습니다.

  OdbcDataAdapter financialAidDocsQuery =
            new OdbcDataAdapter(
                @"SELECT   a.RRRAREQ_TREQ_CODE, 
                           b.RTVTREQ_SHORT_DESC, 
                           a.RRRAREQ_TRST_DESC, 
                           RRRAREQ_STAT_DATE,
                           RRRAREQ_EST_DATE,
                           a.RRRAREQ_SAT_IND, 
                           a.RRRAREQ_SBGI_CODE, 
                           b.RTVTREQ_PERK_MPN_FLAG, 
                           b.RTVTREQ_PCKG_IND, 
                           a.RRRAREQ_MEMO_IND,
                           a.RRRAREQ_TRK_LTR_IND, 
                           a.RRRAREQ_DISB_IND, 
                           a.RRRAREQ_FUND_CODE, 
                           a.RRRAREQ_SYS_IND
                  FROM     FAISMGR.RRRAREQ a, FAISMGR.RTVTREQ b
                  WHERE    a.RRRAREQ_TREQ_CODE = b.RTVTREQ_CODE
                           and a.RRRAREQ_PIDM = :PIDM
                           AND a.RRRAREQ_AIDY_CODE = :AidYear ",
                this.bannerOracle);
        financialAidDocsQuery.SelectCommand.Parameters.Add(":PIDM", OdbcType.Int, 32).Value = this.pidm;
        financialAidDocsQuery.SelectCommand.Parameters.Add(":AidYear", OdbcType.Int, 32).Value = this.aidYear;
        DataTable financialAidDocsResults = new DataTable();
        financialAidDocsQuery.Fill(financialAidDocsResults);
        FADocsGridView.DataSource = financialAidDocsResults;
        FADocsGridView.DataBind();

문제는 그 칼럼이a.RRRAREQ_TRST_DESC존재하지 않습니다.Oracle SQL Developer에서 실행하면 매우 빠르게 학습할 수 있습니다.

이상한 거요?

이 코드는 작동합니다.

그리드 보기가 성공적으로 바인딩됩니다. (이 보기는 해당 필드에 바인딩되지 않습니다.)그리고 그것은 수년간 생산되어 왔습니다.

그래서 제 질문은...왜죠? 저는 나쁜 질의 작업을 본 적이 없습니다.저는 Oracle이 이를 허용하거나 데이터 공급자가 해킹하는 것을 본 적이 없습니다.

여기서 무슨 일이 일어나고 있는지 아는 사람?

음... 몇 가지 확인할 사항:

  1. 이 코드가 실제로 실행됩니까?이것을 제안하는 것은 어리석은 것처럼 보일 수 있지만, 이것을 대체한 새로운 파일이 있을 수 있습니다.

  2. 예외가 코드에 의해 스켈링되고 있습니까?(그런 열 이름을 짓는 사람은 누구나 성가신 예외를 없앨 수 있습니다.)

  3. 타사 코드에 의해 스켈링되는 예외입니까?(가능성은 낮지만 때때로 타사 코드는 예외 대신 성가신 오류 코드를 사용하는 것을 선호합니다.)

그 제안들을 지나치면, 나는 확신할 수 없습니다.

편집:

ASP에서 일하고 있는 경우 두 번째 지점을 다시 방문합니다.NET, 예외 스켈링 중인 글로벌 수준 예외 처리기가 없는지 확인합니다.저는 제가 작업한 한 사이트에서 그 문제에 부딪혔고 하루에 수십 개의 예외를 발견했습니다.

달려보기

select * from v$sql where sql_fulltext like '%a.RRRAREQ_TRST_DESC%'

당신이 그리드를 묶은 직후에.그러면 Oracle이 실제로 이 문장을 봤는지 알 수 있습니다.위의 쿼리는 Oracle에서 볼 수 없는 경우에만 표시해야 합니다.

ODBC 추적 로그를 사용하여 이 쿼리가 실제로 데이터베이스로 전송되는지 확인하고 반환되는 데이터베이스를 확인합니다.그런 다음 다른 ODBC 기반 데이터베이스 도구를 사용하여 이 쿼리가 이 도구에서 작동하는지 확인합니다.최종 테스트로 간단한 Python 스크립트를 작성할 수 있습니다.ActiveState Python 2.x를 사용하는 가장 쉬운 방법은odbc모듈 포함.테스트 코드는 다음과 같습니다.

import odbc

connection = odbc.odbc('dnsname/user/password')
cursor = connection.cursor()
cursor.execute("select ...")
for row in cursor.fetchall():
    print '\t'.join([str(r) for r in row])

프로그램에 오류가 없고 다른 도구에 오류가 있는 경우 ODBC 추적을 비교합니다.

원본 작성자가 무엇을 하려고 했는지 이해하고 배너를 사용하여 결코 쉽게 파악할 수 없다면, 이 쿼리는 정확해야 합니다.

SELECT a.rrrareq_treq_code,
       b.rtvtreq_short_desc,
       c.rtvtrst_desc,
       rrrareq_stat_date,
       rrrareq_est_date,
       a.rrrareq_sat_ind,
       a.rrrareq_sbgi_code,
       b.rtvtreq_perk_mpn_flag,
       b.rtvtreq_pckg_ind,
       a.rrrareq_memo_ind,
       a.rrrareq_trk_ltr_ind,
       a.rrrareq_disb_ind,
       a.rrrareq_fund_code,
       a.rrrareq_sys_ind
FROM   faismgr.rrrareq a,
       faismgr.rtvtreq b,
       faismgr.rtvtrst c
WHERE  a.rrrareq_treq_code = b.rtvtreq_code
AND    a.rrrareq_trst_code = c.rtvtrst_code
AND    a.rrrareq_pidm = :PIDM
AND    a.rrrareq_aidy_code = :AidYear;

허위 경보 범주에 넣어둡시다.

저는 우리의 VAT가 테스트에서 DLL 사본을 보내도록 하기로 결정했습니다.저는 반사경으로 그것을 분해했고, 매우 당황스럽게도, 그 질문이 옳다는 것을 발견했습니다.말이 되네요.

작업 복사본에 잘못된 field_name이 하나 있는 이유를 아직도 알 수 없습니다.제가 알기로는 이번 주 전에는 이 파일을 만져본 적이 없습니다.그러나 SVN은 이전 버전에서 이 오류를 보여주는 기록이 없습니다.

너무 이상해요... 아마 제가 정신을 잃고 있는 것 같아요.

이 질문에 대한 모든 품질 피드백에 감사드립니다.저는 확실히 새로운 문제 슈팅 기술을 배웠고 그것에 대해 매우 감사합니다. :)

해피 코딩, 클리프

언급URL : https://stackoverflow.com/questions/4026142/the-riddle-of-the-working-broken-query

반응형