>  Q&A  >  본문

저장 프로시저에서 CONCAT 문 실행이 작동하지 않습니다.

<p>두 개의 테이블이 있습니다. 하나는 'tconst'(기본 키이기도 함) 값에 대한 다양한 정보를 포함하는 기본 테이블이고, 다른 하나는 'titleId'라는 이름으로 'nconst'의 여러 'tconst' 값에 연결되어 있습니다. </p> <p>---기본 테이블 'titlebasics'</p> <테이블 클래스="s-테이블"> <머리> <tr> <th>tconst</th> <번째> 제목 유형 <일>...</일> </tr> </머리> <본문> <tr> <td>tt0000009</td> <td>영화</td> <td>...</td> </tr> <tr> <td>tt0000147</td> <td>영화</td> <td>...</td> </tr> <tr> <td>...</td> <td>...</td> <td>...</td> </tr> </tbody> </테이블> <p>---추가 정보 테이블 'knownfortitles'</p> <테이블 클래스="s-테이블"> <머리> <tr> <번째> ID <번째>nconst <번째> 타이틀 순서 <번째> 타이틀 ID </tr> </머리> <본문> <tr> <td>1</td> <td>nm0000001</td> <td>1</td> <td>tt0050419</td> </tr> <tr> <td>2</td> <td>nm0000001</td> <td>2</td> <td>tt0053137</td> </tr> <tr> <td>...</td> <td>...</td> <td>...</td> <td>...</td> </tr> </tbody> </테이블> <p>'문제'는 <code>knownfortitles.titleId</code>의 일부 값이 <code>titlebasics.tconst</code>에 존재하지 않는다는 것입니다. 두 테이블의 이름과 해당 열 두 개를 매개 변수로 전달할 수 있는 저장 프로시저를 만들고 싶습니다. 이 프로세스에서는 먼저 첫 번째 테이블에 없는 값이 두 번째 테이블에 실제로 존재하는지 확인하고, 그렇다면 두 번째 테이블에 <code>is_in_<base_table_name></code>라는 이름의 새 테이블을 추가합니다. . 그런 다음 두 번째 테이블의 각 행에 있는 부울 값으로 이 열을 업데이트합니다. 이 문제가 있는 테이블이 많기 때문에 저장 프로시저에서 이 작업을 수행하고 싶습니다. 동일한 코드를 다른 값으로 반복해서 작성하는 대신 이 프로시저를 사용할 수 있기를 원합니다.그러나 내 프로그램을 호출하려고 하면 오류가 발생하며 이를 고칠 수 없는 것 같습니다. </p> <p>저장 프로시저로서 여기서 막히게 됩니다. </p> <pre class="brush:php;toolbar:false;">프로시저 생성 `CheckValueExistsInBaseTable`( IN 체크테이블 VARCHAR(100), 참조된BaseTable VARCHAR(100), IN checkCol VARCHAR(100), 참조된 Col VARCHAR(100) ) 시작하다 DECLARE new_column_name VARCHAR(100) DEFAULT 'is_in_baseTable'; DECLARE sql_statement1 VARCHAR(1000) DEFAULT 'SELECT NULL;'; DECLARE sql_statement2 VARCHAR(1000) DEFAULT 'SELECT NULL;'; SET @new_column_name = CONCAT('is_in_',referencedBaseTable); -- 존재하지 않는 경우 확인된 테이블에 새 열을 추가합니다. SET @sql_statement1 = CONCAT('IF(존재할 경우 사례 선택( 1개를 선택하세요 FROM ', checkTable, ' WHERE ', checkCol, ' NOT IN (SELECT ', referencedCol, ' FROM ', referencedBaseTable, ')) 그런 다음 1 ELSE 0 END ) = 1 그 다음에 ALTER TABLE ', checkTable, ' ADD ', @new_column_name, ' BOOL; 또 다른 NULL을 선택하십시오. END IF'); @sql_statement1에서 stmt1을 준비하세요. 실행 stmt1; 할당 해제 준비 stmt1; -- 확인된 테이블의 is_in_referencedBaseTable 열 업데이트 SET @sql_statement2 = CONCAT('UPDATE', checkTable, ' SET ', @new_column_name, ' = 존재하는 경우(SELECT * FROM ', referencedBaseTable, ' WHERE ', referencedBaseTable, '.', referencedCol, ' = ', checkTable, '.',checkedCol, ') THEN 1 ELSE 0 END'); @sql_statement2에서 stmt2를 준비하세요. 실행 stmt2; 할당 해제 준비 stmt2; 종료</pre> <p>무엇을 변경하려고 해도 다음 오류 중 하나가 발생합니다. </p> <인용문> <p>오류 코드: 1064. SQL 구문에 오류가 있습니다. 1행의 "NULL" 근처에서 사용할 올바른 구문은 MySQL 서버 버전 설명서를 확인하세요. </인용문> <p> 또는 </p> <인용문> <p>오류 코드: 1064. SQL 구문에 오류가 있습니다. 'IF(SELECT CASE WHEN EXISTS( 1개를 선택하세요 유명한 작품부터 1행의 titleId가 아닌 곳</p> </인용문> <p>어떤 부분에 문제가 있는지 확인하기 위해 테스트 프로그램도 만들었지만 둘 다 잘 작동해서 더욱 혼란스럽습니다. 첫 번째는 구문 오류가 있는지 확인하기 위해 <code>CONCAT</code>에 넣은 내용을 반환합니다.</p> <pre class="brush:php;toolbar:false;">프로시저 생성 `테스트`( IN 체크테이블 VARCHAR(100), 참조된BaseTable VARCHAR(100), IN checkCol VARCHAR(100), 참조된 Col VARCHAR(100), IN new_column_name VARCHAR (100) ) 시작하다 -- 변수 선언 및 값 할당 myvar VARCHAR(1000)을 선언합니다. DECLARE new_column_name VARCHAR(100) DEFAULT 'is_in_baseTable'; SET @new_column_name = CONCAT('is_in_',referencedBaseTable); SET myvar = CONCAT('IF(존재하는 경우 선택( 选择1 FROM ', checkTable, ' WHERE ', checkCol, ' NOT IN (SELECT ', referencedCol, ' FROM ', referencedBaseTable, ')) 그런 다음 1 ELSE 0 END ) = 1 그 다음에 ALTER TABLE ', checkTable, ' ADD ', @new_column_name, ' BOOL; 또 다른 NULL을 선택하십시오. END IF'); -- 값을 콘솔에 출력 SELECT concat(myvar) AS 변수; 종료</pre> <p>此过程给出下一个结果:</p> <pre class="brush:php;toolbar:false;">IF (존재하는 경우 선택( 选择1 자지명작물 titleId가 IN이 아닌 곳(titlebasics에서 tconst 선택)) 그런 다음 1 ELSE 0 END ) = 1 그 다음에 제목으로 알려진 ALTER TABLE ADD is_in_titlebasics BOOL; 또 다른 NULL을 선택하십시오. END IF</pre> <p> <pre class="brush:php;toolbar:false;">프로시저 생성 `test2`() 시작하다 IF(존재하는 경우 선택( 选择1 자지명작물 titleId가 IN이 아닌 곳(titlebasics에서 tconst 선택)) 그런 다음 1 ELSE 0 END ) = 1 그 다음에 제목으로 알려진 ALTER TABLE ADD is_in_titlebasics BOOL; 또 다른 NULL을 선택하십시오. 종료하면; 종료</pre> <p>此过程将列 <code>is_in_titlebasics</code> 添加到表 <code>knownfortitles</code> 中,这就是我想要发生的事情,所以这很好。此时,我完全迷失了,不知道为什么我的实际存储过程不起是,因为它基本上是最后两个过程的组合。我暂时忽略了我希望存储过程执行的第twopart分,因为我遇到的错误似乎将第一个 <code>CONCAT</code> 语句视为问题。</p> <p>저는 提前致谢!</p>
P粉644981029P粉644981029410일 전558

모든 응답(1)나는 대답할 것이다

  • P粉798343415

    P粉7983434152023-09-07 00:02:02

    P.Salmon님 덕분에 준비된 문장을 통해 IF ... THEN문을 실행하는데 문제가 있다는 것을 알게 되었습니다. 이건 불가능 해. 약간의 고민 끝에 나는 내가 원하는 대로 정확히 작동하는 다음 프로그램을 생각해 냈습니다. 나와 비슷한 문제를 겪고 있는 사람들에게 도움이 될 수 있기를 바랍니다.

    으아악

    그러나 프로그램에서 오류가 발생하는 것을 방지하기 위해 TRY ... CATCH 또는 아무것도 추가하지 않았다는 점을 지적하고 싶습니다. 이는 작동하기 위한 최소한의 조치일 뿐입니다.

    통화 과정

    으아악

    반환 메시지 확인:

    또는 메시지 경고:

    첫 번째 경우에만 필요에 따라 TINYINT(1) 열이 추가됩니다.

    회신하다
    0
  • 취소회신하다