简体   繁体   中英

Updating a column in PL/SQL

(Using PL/SQL anonymous program block) I have a table tblROUTE2 of Mexican state highways:

+-----------------+------------+---------+----------+----------+----------------------------+-----------+--------+
|      TYPE       | ADMN_CLASS | TOLL_RD | RTE_NUM1 | RTE_NUM2 |         STATEROUTE         | LENGTH_KM |  STATE |
+-----------------+------------+---------+----------+----------+----------------------------+-----------+--------+
| Paved Undivided | Federal    | N       |       81 |          | Tamaulipas Federal Hwy  81 | 124.551   |  NULL  |
| Paved Undivided | Federal    | N       |      130 |          | Hidalgo Federal Hwy 130    | 76.347    |  NULL  |
| Paved Undivided | Federal    | N       |      130 |          | Mexico Federal Hwy 130     | 68.028    |  NULL  |
+-----------------+------------+---------+----------+----------+----------------------------+-----------+--------+

and tblSTATE2 of Mexican states:

+------+-----------------------+---------+-----------+
| CODE |         NAME          | POP1990 | AREA_SQMI |
+------+-----------------------+---------+-----------+
| MX02 | Baja California Norte | 1660855 | 28002.325 |
| MX03 | Baja California Sur   |  317764 | 27898.191 |
| MX18 | Nayarit               |  824643 | 10547.762 |
+------+-----------------------+---------+-----------+

I need to update the STATE field in tblROUTE2 with the CODE field found in tblSTATE2, based on the route name in tblROUTE2. Basically, I need to somehow take the first string or two (some routes have two names)-- before the string 'Federal'-- of the STATEROUTE field in tblROUTE2 and make sure it matches with the string in the NAME field in tblSTATE2. Then since the states are matched with a CODE, update those codes in the STATE field of tblROUTE2.

I have started a code:

DECLARE
  state_code         
     tblROUTE2.STATE%TYPE;
  state_name   
     tblSTATE2.NAME%TYPE;
BEGIN
  SELECT STATE, NAME
    INTO state_code
    FROM tblROUTE2 r, tblSTATE2 s
   WHERE STATEROUTE LIKE '%Federal';
END;

As well, I will need to remove the state name from the route name. For example, the string in STATEROUTE 'Tamaulipas Federal Hwy' becomes 'Federal Hwy'. I have started a code, not sure if it's right:

UPDATE tblROUTE2
SET STATEROUTE = TRIM(LEADING FROM 'Federal');

Using MERGE update :

MERGE INTO tblROUTE2 A
USING
(
    SELECT CODE, NAME  FROM tblSTATE2
) B 
ON 
(
    upper(SUBSTR(A.STATEROUTE, 0, INSTR(UPPER(A.STATEROUTE), UPPER('FEDERAL'))-2)) = upper(B.NAME)
)
WHEN MATCHED THEN UPDATE 
    SET A.STATE = B.CODE;

Here in FIDDLE I've replicated your tables and added additional record where STATEROUTE matches one of the records in NAME . Although Fiddle return an error, I ran it in my Oracle DB, and one record was updated correctly as the following screenshot:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM