저장 프로시저에서 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>