Concat a string to a variable to use as a column name in a query
The problem with your query is that you need to construct meta-data (name of a column) with data. You therefore need to first construct the query, and then execute it using dynamic SQL. Something like (untested)
CREATE PROCEDURE P
LANGUAGE SQL
BEGIN
    DECLARE STMT VARCHAR(100);
    DECLARE APPROP CHAR(1);

    SELECT APPROPRIATION INTO APPROP FROM ...;
    SET STMT = 'SELECT APPROP' || APPROP || ' FROM ... ';
    EXECUTE IMMEDIATE STMT;
END @

I used @ as a statement terminator. Note that the compiler has no way to verify that the query makes sense, so you may end up with run-time errors.
Debugging stored procedures
IBM Datastudio has a fully-fledged stored procedure debugger, i.e. you can set breakpoints, inspect variables, etc. If you for some reason does not want to install it (or like me, can not find the download page:-), you can use the DBMS_OUTPUT module:
~]$ # add some sample data
~]$ db2 &quot;create table t (APPROPRIATION char(1) not null)&quot;
~]$ db2 &quot;insert into t (APPROPRIATION) values ('1')&quot;
~]$ db2 &quot;insert into t (APPROPRIATION) values ('2')&quot;
~]$ db2 &quot;insert into t (APPROPRIATION) values ('3')&quot;
~]$ db2 &quot;insert into t (APPROPRIATION) values ('4')&quot;

~]$ cat p.sql 
CREATE PROCEDURE P()
LANGUAGE SQL
BEGIN
    DECLARE STMT VARCHAR(100);
    DECLARE APPROP CHAR(1);

    SELECT APPROPRIATION INTO APPROP FROM T ORDER BY RAND() FETCH FIRST 1 ROWS ONLY;
    SET STMT = 'SELECT APPROP' || APPROP || ' FROM ...';
    call dbms_output.put_line('DEBUG: ' || STMT);
    -- EXECUTE IMMEDIATE STMT;
END @

~]$ db2 -td@ -f p.sql

~]$ db2 &quot;SET SERVEROUTPUT ON&quot;
DB20000I  The SET SERVEROUTPUT command completed successfully.
~]$ db2 &quot;CALL P()&quot;

  Return Status = 0

DEBUG: SELECT APPROP1 FROM ...
~]$ db2 &quot;CALL P()&quot;

  Return Status = 0

DEBUG: SELECT APPROP1 FROM ...
~]$ db2 &quot;CALL P()&quot;

  Return Status = 0

DEBUG: SELECT APPROP2 FROM ...
~]$ db2 &quot;CALL P()&quot;

  Return Status = 0

DEBUG: SELECT APPROP1 FROM ...
~]$ db2 &quot;CALL P()&quot;

  Return Status = 0

DEBUG: SELECT APPROP3 FROM ...

~]$ db2 &quot;SET SERVEROUTPUT OFF&quot;
    

Another option is to use an out variable:
~]$ cat p2.sql 
CREATE PROCEDURE P2(OUT outstmt VARCHAR(100))
LANGUAGE SQL
BEGIN
    DECLARE STMT VARCHAR(100);
    DECLARE APPROP CHAR(1);

    SELECT APPROPRIATION INTO APPROP FROM T ORDER BY RAND() FETCH FIRST 1 ROWS ONLY;
    SET STMT = 'SELECT APPROP' || APPROP || ' FROM ...';
    SET outstmt = stmt;
    call dbms_output.put_line('DEBUG: ' || STMT);
    -- EXECUTE IMMEDIATE STMT;
END @

~]$ db2 -td@ -f p2.sql

~]$ db2 &quot;CALL P2(?)&quot;

  Value of output parameters
  --------------------------
  Parameter Name  : OUTSTMT
  Parameter Value : SELECT APPROP1 FROM ...

  Return Status = 0

One major drawback with both these methods is that they will not produce any output when you need it the most, i.e. when your procedure fails.
For future posts, always include a reproducible setup. Either include DDL (create table statements, etc) and SQL (insert table statements) or use a service like DB&lt;&gt;Fiddle.
Most people (including myself) usually just skip to the next question unless there an easy way to reproduce the problem. Not only will you get more answers, but they will also be ready to use since you defined the setup. As of now, if my answer is at all usable for you, you will have to adapt it to your actual setup since I invented some imaginary tables etc.